Python多層裝飾器執行順序理解
阿新 • • 發佈:2019-01-25
最近在Python中遇到了修飾器(decorator)這個概念,一直不是十分理解。在看了python裝飾器詳解這篇部落格後,對其的概念和用法有了一個大致的認識。但是,部落格的最後一個例子我還是沒有能夠正確寫出執行結果。因此我又自己寫了一個多層修飾器的例子。以下是我對執行過程的理解。
# an example of python decorator
def deco1(func):
print(1)
def wrapper1():
print(2)
func()
print(3)
print(4)
return wrapper1
def deco2(func):
print(5)
def wrapper2():
print(6)
func()
print(7)
print(8)
return wrapper2
@deco1
@deco2
def foo():
print('foo')
if __name__ == '__main__':
foo()
執行結果:
5
8
1
4
2
6
foo
7
3
- 修飾器本質上就是一個函式,只不過它的傳入引數同樣是一個函式。因此,依次加了
deco1
和deco2
兩個裝飾器的原函式foo實際上相當於deco1(deco2(foo))
- 明白了第1步後,下面進入這個複合函式。首先執行的是內層函式
deco2(foo)
。因此第一個列印值是5。接下來要注意,在deco2
這個函式內定義了一個wrapper2
函式,但是並沒有類似於wrapper2()
的語句,因此該函式內的語句並沒有立即執行,而是作為了返回值。因此wrapper2
內的3條語句作為輸入引數傳遞到了deco1
內。wrapper2
函式內還有一行print(8)
,因此第二個列印值為8。 - 下一步是執行
deco1()
函式內容。與2類似,先打印出1和4,返回值為wrapper1
。由於更外層沒有裝飾器,因此接下來就將執行wrapper1
內的內容。第五個列印值為2。接著執行func()
func()
表示的是wrapper2
中的內容,因此跳到wrapper2
中執行。第六個列印值為6。類似的,wrapper2
中的func()
為foo()
,因此接著會輸出foo。最後,回到wrapper2
和wrapper1
的最後一行,依次輸出7和3。到這裡,整個裝飾器的執行過程結束。