今天學了裝飾器,有些懵逼,主要是其執行順序分析起來有些複雜,就好比我,現在就來理下裝飾器的執行順序,只討論 函式裝飾器,類裝飾器還沒學到。
先看乙個兩層裝飾器:
def fir(func2):print(2)
def warp2(*args,**kwargs):
print(3)
func2(*args,**kwargs)
print(6)
return warp2
def sec(func1):
print(1)
def warp1(*args,**kwargs):
print(4)
func1(*args,**kwargs)
print(5)
return warp1
@fir
@sec
def aa(c):
print(c)
aa('最裡邊')
執行結果:
分析一下:
我的理解,裝飾器就是把函式層層裝飾。藏到最裡面,呼叫的話從最外邊找。
你可以把裝飾器比喻成煉丹爐,被裝飾的函式好比是猴子,我們的任務就是救出煉丹爐的猴子。
裝飾器就是打包後塞給另乙個裝飾器,被裝飾的函式在最裡面,執行順序,你先要爬到最高的裝飾器上面往下跳
sec裝飾器裡面打包了aa函式,返回值warp直接扔給了上一層的裝飾器fir,fir裝飾器接受到扔來的打包裝飾器引用給了fun2,所以
現在的fun2引用的是sec裝飾器的包裹。要想獲得資料就需要開啟sec這個包裹才能救出猴子。
這裡aa函式引用到了func1,往下走**,遇到print(1)可以執行,則執行。載入warp1進入記憶體return返回warp1
這裡@fir和@sec你可以看作是
@fir = aa = fir(aa)
@sec = aa = sec(aa)
這裡fir的aa和sec裡的aa有些區別,你可以看成
aa = fir(warp1)
warp1 = sec(aa)
fir(aa)指的是aa函式 ,最上面的aa則指的是aa函式的呼叫,最下面呼叫的aa(c)
aa(c) 就是被裝飾的函式的最終執行語句
fir拿到warp1的資料來到fir裝飾器裡開始執行,遇到print(2)執行。往下走,返回warp2,到現在所有的資料都打包好了,該執行的都執行了,然後就去找老君要鑰匙吧
aa = fir(warp1)
執行語句aa()相當於開啟煉丹爐的鑰匙,可以開啟打包好的函式
fri(warp1)拿到鑰匙就可以進入warp2函式了。
遇到print(3)執行,
遇到了finc2()執行函式,那我們就可以進入到func2,別忘了func2可是通往sec裝飾器的大門,猴子就是被關在那裡的。
我們通過 func2 ----warp1 來到sec,新的一關開始了
剛開始就遇到print(4),直接消滅了。找到了func1函式,猴子就被關在這個函式裡。執行aa()函式
至此,任務完成。成功救到了猴子,接下來的任務就是離開煉丹爐了。
返回又遇到了print(5)順手消滅了。
通過warp1 ------func2 離開sec裝飾器,來到fir裝飾器
遇到print(6)消滅
通過warp2 ------返回到外面的世界。
所以我們把猴子交給aa()函式,遊戲通關
至此程式也完結了。
分析結束。
程式選單
消滅怪獸
print(1)-------print(2)--------print(3)---------print(4)---------print(5)---------print(6)
完結撒花。
所以說裝飾器就是乙個先順著裝飾器找到最外層的裝飾器,把所有的程式打包好,在去函式執行那裡去取進入封裝函式的鑰匙
一路向下找到被裝飾的函式執行,最後在順著函式爬出來的過程。結合其他部落格的裝飾器的內容,裝飾器的就不難理解了。
最後說一句,這怎麼這麼像fc遊戲!!
Python 裝飾器執行順序
nisen的 python 裝飾器執行順序迷思 原址 裝飾器是python用於封裝函式或 的工具,網上可以搜到很多文章可以學習,我在這裡要討論的是多個裝飾器執行順序的乙個迷思。大部分涉及多個裝飾器裝飾的函式呼叫順序時都會說明它們是自上而下的,比如下面這個例子 def decorator a func...
python裝飾器執行順序
python 裝飾器 1 2層裝飾器 def decorator func todo def args,kwargs todo func args,kwargs todo todo 3層裝飾器 def decorator3 a 0 b 0 todo def func todo def args,kw...
Python 裝飾器執行順序
之前同事問到兩個裝飾器在 中使用順序不同會不會有什麼問題,裝飾器是對被裝飾的函式做了一層包裝,然後執行的時候執行了被包裝後的函式,例如 def decorator a fun def inner a args,kwargs print inner a return fun args,kwargs r...