python-带能数的装饰器
from functools import wraps
from functools import wraps #引入一行 def wrapper(func_1): @wraps(func_1) #加入一行 def inner(*args,**kwargs): ret = func_1(*args,**kwargs) return ret return inner @wrapper def func_1(a): print('来呀'+a) return # func_1 = wrapper(func_1) func_1('c') print(func_1.__name__) 如果不引入wraps,不加@wraps(func_1)时打印下面话打印出 $inner 加上引入,加@时打印 $func_1
带参数的装饰器
flag = True def outter(flag): def wrapper1(func_1): def inner(*args,**kwargs): if flag : print('func_1 begin') ret = func_1(*args,**kwargs) print('func_1 end') return ret ret = func_1(*args,**kwargs) return ret return inner return wrapper1 @outter(flag) # func_1 = wrapper(func_1) def func_1(a): print('来呀'+a) return @outter(flag) # func_1 = wrapper(func_1) def func_2(a): print('来呀'+a) return func_1('func_1') func_2('func_2')
@与outter(flag)两部份 第一步:outter(flag)返回给wrapper1 第二步:@wrapper1 两步后语法糖转化为: wrapper1 = utter(flag)
多个装饰器装饰同一个函数
def wrapper1(func_1): def inner(*args,**kwargs): print('func_1 begin') ret = func_1(*args,**kwargs) print('func_1 end') return ret return inner def wrapper2(func_1): def inner(*args,**kwargs): print('func_2 begin') ret = func_1(*args,**kwargs) print('func_2 end') return ret return inner @wrapper2 @wrapper1 # func_1 = wrapper(func_1) def func_1(a): print('来呀'+a) return '哈哈' func_1('c') $func_2 begin $func_1 begin $来呀c $func_1 end $func_2 end '哈哈'