歡迎您光臨本站 註冊首頁

Python多個裝飾器的調用順序實例解析

←手機掃碼閱讀     limiyoyo @ 2020-06-06 , reply:0

一般情況下,在函數中可以使用一個裝飾器,但是有時也會有兩個或兩個以上的裝飾器。多個裝飾器裝飾的順序是從裡到外(就近原則),而調用的順序是從外到裡(就遠原則)

樣例:

  def func1(func):    print(1)    def inner1(*args, **kwargs):      print(2)      res = func(*args, **kwargs)      print(3)      return res    print(4)    return inner     def func2(func):    print(5)    def inner2(*args, **kwargs):      print(6)      res = func(*args, **kwargs)      print(7)      return res    print(8)    return inner
  @func1  @func2  def go():    print("running..")
go()

 

 其實函數go的執行本質是如下:

  • a=func2(go);a的內容為inner2函數的函數地址;因此輸出的內容為5,8兩個值

  • b=func1(a);b的內容為inner1函數的函數地址,因此輸出的內容為1,4兩個值

  • b();執行inner1()函數,裡面的func的值為inner2,而inner2裡面的func的值為go,因此輸出的內容,因此為2,6,running,7,3

即b(func1(func2(go)))()

等同如下效果:

a=func2(go);a的內容為inner2函數的函數地址;因此輸出的內容為5,8兩個值

go=func1(a);此處的go是一個新變量,而非go函數的標識,go的內容為inner1函數的函數地址,因此輸出的內容為1,4兩個值

go();執行inner1()函數,裡面的func的值為inner2,而inner2裡面的func的值為真正定義的go函數地址,因此輸出的內容,因此為2,6,running,7,3

即go(func1(func2(go)))()

實測結果:

  C:Python27python.exe D:/code-program/lianxi-test/route.py  5  8  1  4  2  6  running..  7  3     Process finished with exit code 0

[limiyoyo ] Python多個裝飾器的調用順序實例解析已經有236次圍觀

http://coctec.com/docs/python/shhow-post-237173.html