python中多装饰器执行顺序
python中会遇到被多个装饰器装饰,那么这几个装饰器的执行顺序是如何的呢?下面通过函数装饰器装饰函数的例子来说明下。
1 def say_hi(func): 2 def wrapper(*args,**kwargs): 3 print("HI") 4 ret = func(*args,**kwargs) 5 print("BYE") 6 return ret 7 8 return wrapper 9 10 11 def say_yo(func): 12 def wrapper(*args,**kwargs): 13 print('yo') 14 ret = func(*args,**kwargs) 15 return ret 16 return wrapper 17 18 # 加载顺序是由下而上 实际上 func = say_hi(say_yo(func)) 19 @say_hi # func = say_hi(func) 20 @say_yo # func = say_yo(func) 21 def func(): 22 print('hello world') 23 func()
# 执行结果
# HI
# yo
# hello world
# BYE
网上说装饰器加载顺序是由下向上,执行顺序是由上向下。个人觉得不太好理解,其实只要将多个装饰器装饰的本质罗列下,比如上述代码中2个装饰器装饰了func函数,转换下就是:func = say_hi(say_yo(func))。
首先,可以将say_yo(func)看成一个参数,传递到say_hi()中,那么看下执行顺序。先回执行下print('HI'),然后say_yo(func)就是say_hi中的func函数,func(*args,**kwargs),也就是say_yo(func)(),执行say_yo函数,将被装饰的func函数传递到say_yo函数中,那么就先执行print(“yo”),然后执行被装饰的func函数,就print('hello world") 。最后say_hi中的func()执行完毕后,后面还要执行下print("BYE"),至此就结束了。
所以,总结下:只要将多个装饰器还原成本质的状态去理解就比较清晰了。记录下。