Python 裝飾器淺解
Python裝飾器分爲兩個過程:
一是裝飾器裝載過程;
二是調用裝載後的裝飾器過程;
示例:
# @auth: applex
# @date: 2018-10-10
# coding=utf-8
def deco1(func):
print ("deco1 loading!")
def one():
print ('one calling!')
func()
print ('one calling end!')
return one
def deco2(func):
print ("deco2 loading!")
def two():
print('two calling!')
func()
print ('two calling end!')
return two
@deco1
@deco2
def test():
print ('test calling!')
test()
結果
deco2 loading!
deco1 loading!
one calling!
two calling!
test calling!
two calling end!
one calling end!
代碼執行過程如下:
解釋器遇到裝飾函數首先執行裝載,相當於執行了test=deco1(deco2(test)):
- 首先執行deco2(test),輸出
deco2 loading!
,將deco2的func參數指向test函數,並返回函數two;- 接着執行deco1(two),輸出
deco1 loading!
,將deco1的func參數指向two函數,並返回函數one;- 裝載完畢後,得到結果 test = one;
- 最後調用test,實際調用函數one,輸出
one calling!
;
在函數one中調用函數func,實際調用的是函數two,輸出two calling!
;
在函數two中調用函數func,實際調用的是函數test的代碼,輸出test calling!
;
調用結束後,按調用順序依次返回two calling end!
,one calling end!
如果註釋掉 test()調用,則結果:
deco2 loading!
deco1 loading!
參考博文:
python裝飾器詳解 1