1. 程式人生 > >python開發-多個裝飾器的執行順序

python開發-多個裝飾器的執行順序

今天講一下python中裝飾器的執行順序,以兩個裝飾器為例。

裝飾器程式碼如下:

def wrapper_out1(func):
 print('--out11--')
 def inner1(*args, **kwargs):
 print("--in11--")
 ret = func(*args, **kwargs)
 print("--in12--")
 return ret
 print("--out12--")
 return inner1
def wrapper_out2(func):
 print('--out21--')
 def inner2(*args, **kwargs):
 print("--in21--")
 ret = func(*args, **kwargs)
 print("--in22--")
 return ret
 print("--out22")
 return inner2
@wrapper_out2
@wrapper_out1
def test():
 print("--test--")
 return 1 * 2
if __name__ == '__main__':
 test()

執行結果如下:

"""
--out11--
--out12--
--out21--
--out22--
--in21--
--in11--
--test--
--in12--
--in22--
"""

執行順序以圖片形式展示如下:

python開發-多個裝飾器的執行順序

 

先進入離test函式最近的裝飾器,由於裝飾器中返回的是函式的函式名引用,並非真正呼叫函式,所以先列印:

--out11--
--out12--
--out21--
--out22--

到inner2後,func會真正執行函式,會呼叫inner1(),所以再列印:

--in21--
--in11--

到inner1中,func會呼叫test函式,所以會列印:

--test--

再從各個函數出來後,會依次列印:

--in12--
--in22--

合起來就是上面的執行結果。

各位小夥伴看明白了嗎?有問題歡迎隨時評論交流。