python装饰器(一)

一、我们先看看装饰器的应用基本格式:

def decorator(func):
    def inner(*args,**kwargs):
        data = func(*args,**kwargs)
        return data
    return inner

 

外层函数中嵌套了一个内部函数,并把我们需要执行的函数地址,传入到外层函数里,最终返回一个内部函数内存地址(inner)。

应用:

def decorator(func):
    def inner(*args,**kwargs):
        print('在函数执行前')
        data = func(*args,**kwargs)
        return data
    return inner


@decorator
def fu():
    return 'hello world'

data = fu()
print(data)

@decorator 这个的作用:等价于fu =decorator(fu) #我们把fu重新赋值,返回inner地址给到fu.这时候inner没有被执行,fu的地址等于inner地址,并报原来fu的地址赋值给了func。

当我们执行调用fu()函数的时候,等于是执行了 inner函数,inner函数中执行了fu的函数,在外层函数中,我们已把fu函数地址赋值给了func.在执行fu()函数前,并可以做一些其他的操作,比如打印。

从上面的结果来说,装饰器可以在我们不修改原函数的基础上,做一些二次修改的功能。把原有函数封装在一另一个函数中(类似闭包)。

二.带参数的装饰器

基本格式:

def decorator(n):
    def x(func):
        def inner(*args,**kwagrs):
            val = []
            for i in range(n):
                data = func()
                val.append(data)
            return val
        return inner
    return x



@decorator(9)
def fu():
    return 666


data = fu()
print(data)

 多参数的装饰是在基本装饰器的基础上又加了一层嵌套,它的工作流程:

扫描二维码关注公众号,回复: 7108133 查看本文章

1.先执行最外层的函数,decorator(n),在内存中建立x函数,并返回了x内存函数的地址,n=作为参数,接受值

2.再执行x函数,在内存中建立了inner函数,并把被封装的函数作为参数,穿进inner只能中,等价于fu =x(fu),并返回inner内存地址,如此在装饰器当中就有2个值 n=9 func=fu

3.接下来执行fu(),相当于执行了inner函数中的代码,我们就可以使用保存下来的2个值进行下面的操作。

最终结果为:[666, 666, 666, 666, 666, 666, 666, 666, 666]

注:如果不使用@的情况下我们的装饰器赋值过程大致如下:

def decorator(n):
    def x(func):
        def inner(*args,**kwagrs):
            val = []
            for i in range(n):
                data = func()
                val.append(data)
            return val
        return inner
    return x



def fu():
    return 666
####工作流程####
res = decorator(9)
res1 = res(fu)
fu = res1
data = fu()
print(data)

结果跟上一个结果是一样,如果不用 @,我们使用如下方式也能达到效果。

猜你喜欢

转载自www.cnblogs.com/jinyan-huang/p/11416522.html
今日推荐