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"),至此就结束了。

  所以,总结下:只要将多个装饰器还原成本质的状态去理解就比较清晰了。记录下。

 

 

posted on 2022-10-20 13:28  一先生94  阅读(572)  评论(0编辑  收藏  举报

导航