天天看點

Python 疊加多個裝飾器的加載順序及執行順序疊加多個裝飾器的加載、運作分析

疊加多個裝飾器的加載、運作分析

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)
           

多個裝飾器的時候總結:

加載順序:自下而上

執行順序:函數調用前的,自上而下,函數調用後的,自下而上(參見代碼正在運作後數字)