1. 程式人生 > >Python多層裝飾器執行順序理解

Python多層裝飾器執行順序理解

最近在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
  1. 修飾器本質上就是一個函式,只不過它的傳入引數同樣是一個函式。因此,依次加了deco1deco2兩個裝飾器的原函式foo實際上相當於deco1(deco2(foo))
  2. 明白了第1步後,下面進入這個複合函式。首先執行的是內層函式deco2(foo)。因此第一個列印值是5。接下來要注意,在deco2這個函式內定義了一個wrapper2函式,但是並沒有類似於wrapper2()的語句,因此該函式內的語句並沒有立即執行,而是作為了返回值。因此wrapper2內的3條語句作為輸入引數傳遞到了deco1內。wrapper2函式內還有一行print(8),因此第二個列印值為8。
  3. 下一步是執行deco1()函式內容。與2類似,先打印出1和4,返回值為wrapper1。由於更外層沒有裝飾器,因此接下來就將執行wrapper1內的內容。第五個列印值為2。接著執行func()
    函式,注意此處func()表示的是wrapper2中的內容,因此跳到wrapper2中執行。第六個列印值為6。類似的,wrapper2中的func()foo(),因此接著會輸出foo。最後,回到wrapper2wrapper1的最後一行,依次輸出7和3。到這裡,整個裝飾器的執行過程結束。