装饰器的作用:
不想通过修改函数的调用方式,在函数的前后添加功能
最简单的装饰器:
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)这句代码