【函数篇】装饰器

装饰器的作用:

  不想通过修改函数的调用方式,在函数的前后添加功能

最简单的装饰器:

def wrapper(f):
    def inner():
        pass
        f()    #执行的是被装饰的函数
        pass
    return inner  #返回的是inner的地址 给到了func

@wrapper   #语法糖@等于func = wrapper(fanc)
def func():  #被装饰的函数
    pass
#func = wrapper(fanc) 
func()        #执行的是inner函数
       

执行顺序:

 当被装饰的函数有返回值时,由于执行的是inner,所以需要在inner函数里获取被装饰函数的返回值,再通过inner返回出来:

def wrapper(f):
    def inner():
        pass
        ret = f()  #接收被装饰函数的返回值
        pass
        return ret #返回接收的返回值
    return inner

@wrapper
def func():
    return None #返回值
func()

当被装饰的函数同时需要进行传值时,只需再inner函数里接收即可,接收后同样需要被函数体内的被装饰的函数调用,*args和**kwargs同时使用,可以接收所以类型参数:

def wrapper(f):
    def inner(*args,**kwargs):
        pass
        ret = f(*args,**kwargs)
        pass
        return ret
    return inner

@wrapper
def func(a,b,c,d = 1):
    return None
func(1,2,3,4)

所以,这就是一个完整的装饰器,即装饰器的固定模式

注:

语法糖:

  表达方式:@装饰器函数

例如上方代码中的@wrapper,等同于func = wrapper(func)这句代码

原文地址:https://www.cnblogs.com/aizhinong/p/11360081.html