疊加多個裝飾器的加載、運作分析
def deco1(func1): # func1 = wrapper2的記憶體位址
def wrapper1(*args,**kwargs):
print('正在運作1===>deco1.wrapper1')
res1=func1(*args,**kwargs)
print('正在運作7===>deco1.wrapper1')
return res1
return wrapper1
def deco2(func2): # func2 = wrapper3的記憶體位址
def wrapper2(*args,**kwargs):
print('正在運作2===>deco2.wrapper2')
res2=func2(*args,**kwargs)
print('正在運作6===>deco2.wrapper2')
return res2
return wrapper2
def deco3(x):
def outter3(func3): # func3=被裝飾對象index函數的記憶體位址
def wrapper3(*args,**kwargs):
print('正在運作3===>deco3.outter3.wrapper3')
res3=func3(*args,**kwargs)
print('正在運作5===>deco3.outter3.wrapper3')
return res3
return wrapper3
return outter3
# 加載順序自下而上(了解)
@deco1 # index=deco1(wrapper2的記憶體位址) ===> index=wrapper1的記憶體位址
@deco2 # index=deco2(wrapper3的記憶體位址) ===> index=wrapper2的記憶體位址
@deco3(111) # ===>@outter3===> index=outter3(index) ===> index=wrapper3的記憶體位址
def index(x,y):
print('正在運作4===>index')
print('from index %s:%s' %(x,y))
index(1,2) # wrapper1(1,2)
多個裝飾器的時候總結:
加載順序:自下而上
執行順序:函數調用前的,自上而下,函數調用後的,自下而上(參見代碼正在運作後數字)