1,单层装饰器
def timer(func): def init(*args,**kwargs): func() return init
@timer #func = timer(func) def func(*args,**kwargs): print('is here') func()
2,多层装饰器
def before(func): def init2(*args,**kwargs): print(111) func() print(5555) return init2 def after(func): def init1(*args,**kwargs): print(2222) func() print(4444) return init1 @before @after #多层装饰器由外层装饰器包含内部装饰器 mid=before(after(mid)) def mid(*args,**kwargs): print(333) mid()
===>
111
222
333
444
555
#打印结果的顺序和调用顺序刚好相反。
函数的调用顺序
1,after(mid) 先执行最里面的after return init1函数
2,before(init1) 再次执行before函数 return init2
3, 执行func() 因为函数func已经等于init2 ,所以打印111
4,执行before里面的func() 因为前面before(init1)已经把func变成init1,所以变相的执行init1()
5,执行init1() 打印2222
6,执行after里面的func() 因为开始after(mid) 把mid函数穿进去了,所以执行mid()
7,mid() 打印333
8,执行完mid() 继续执行print(444)
9,在打印444和5555
3,带参数的装饰器:根据传的参数,后面进行其他逻辑操作
3 F=False#为False时就把装饰器给去掉了 4 def outer(flag): 5 def wrapper(func): 6 def inner(*args,**kwargs): 7 if flag: 8 print('before') 9 ret=func(*args,**kwargs) 10 print('after') 11 else: 12 ret = func(*args, **kwargs) 13 return ret 14 return inner 15 return wrapper 16 17 @outer(F)#@wrapper 18 def hahaha(): 19 print('hahaha') 20 21 @outer(F) 22 def shuangwaiwai(): 23 print('shuangwaiwai') 24 25 hahaha() 26 shuangwaiwai()