雙裝飾器
def w1(func1):
print('outter1')
def inner1(*args,**kwargs):
print('inner11')
func1(*args,**kwargs)
print('inner12')
return inner1
def w2(func2):
print('outter2')
def inner2(*args,**kwargs):
print('inner21')
func2(*args,**kwargs)
print('inner22')
return inner2
@w1@w2
def f1(a, b):
print('f1 %s %s'%(a, b))
f1(10,5)
兩個裝飾器的執順序是
1 w2
2 w1
3 inner1
4 inner2
5 f1
雙裝飾器流程詳解:
單裝飾器的程式讀到裝飾器會先把該閉包的外函式讀一遍
1 外函式開闢空間
2 外函式在內函式上邊的程式執行
3 內函式開闢空間
4 返回內函式
5 被裝飾函式的變數名接收到內函式的引用
6 呼叫5
7 內函式**執行
8 呼叫被裝飾函式
9 內函式**執行完畢返回給呼叫的函式
要注意在這個過程中只要出現func()就算是呼叫被裝飾函式了,如果有返回值直接宣告區域性變數接收即可
不需要使用return
1 雙裝飾器的時候上邊的裝飾器發現自己下邊不是乙個函式,是裝飾器就會先執行下邊的裝飾器
2 下邊的裝飾器執行到單裝飾器的第5步獲得乙個內函式,此時不能繼續呼叫內函式,因為上邊的裝飾器想要的東西已經產生了
3 上邊的裝飾器執行單裝飾器的流程,執行到第5步,判斷沒有其他裝飾器了,再判斷下方有沒有被裝飾函式的呼叫,此時需要通過它下邊的裝飾器尋找
4 被裝飾函式變數名儲存的函式被呼叫,此時被裝飾函式的變數名儲存的函式是inner1,呼叫inner1
5 執行inner1 發現有外函式w1傳進來的函式呼叫,此時該引用儲存的是inner2,呼叫inner2
6 執行inner2 發現有外函式w2傳進來的函式呼叫,該引用儲存的是被裝飾函式,呼叫被裝飾函式
7 被裝飾函式呼叫完畢,返回到呼叫它的地方inner2中的func2()並執行下邊的**
8 inner2執行完畢,返回到inner1的func1()繼續執行下邊的**,
9 inner1執行完畢,返回到呼叫inner1的f1()程式執行完畢
不讀程式的呼叫f1()先把裝飾器外函式讀完,返回內函式才會去讀函式的呼叫,此時裝飾器所裝飾的函式其實已經被讀過了,而上裝飾器在返回了inner1的時候需要去下方查詢有沒有呼叫inner1函式,通過下裝飾器去找到f1()呼叫,並開始進行函式呼叫,此時在func1()之前的**先被執行,而到func1()就會呼叫inner2,此時func2()前邊的**先被執行,到func2()執行f1函式,返回到func2()繼續執行下一步,fun2()後邊的**得以執行,inner2()執行完畢返回給func1()執行inner1剩下的內容,inner1執行完畢返回給f1()
整個執行順序就是 outter2 outter1 nner11 inner21 f1 inner22 inner12
python裝飾器(步驟詳解)
一 什麼是裝飾器 1 對現有已經實現功能的 進行擴充套件。2 不用修改被撞時物件的源 和呼叫方法 二 裝飾器的使用 無引數裝飾器 示例 def zsq func def yz args print 驗證 return func args return yz zsq def hs name print...
Python 裝飾器執行順序
nisen的 python 裝飾器執行順序迷思 原址 裝飾器是python用於封裝函式或 的工具,網上可以搜到很多文章可以學習,我在這裡要討論的是多個裝飾器執行順序的乙個迷思。大部分涉及多個裝飾器裝飾的函式呼叫順序時都會說明它們是自上而下的,比如下面這個例子 def decorator a func...
函式裝飾器執行順序
今天學了裝飾器,有些懵逼,主要是其執行順序分析起來有些複雜,就好比我,現在就來理下裝飾器的執行順序,只討論 函式裝飾器,類裝飾器還沒學到。先看乙個兩層裝飾器 def fir func2 print 2 def warp2 args,kwargs print 3 func2 args,kwargs p...