一、叠加多个装饰器加载与运行
先定义三个装饰器:前两个为无参装饰器,后一个为有参装饰器
def deco1(func1): # func1 = wrapper2的内存地址
def wrapper1(*args,**kwargs):
print('正在运行===>deco1.wrapper1')
res1=func1(*args,**kwargs)
return res1
return wrapper1
def deco2(func2): # func2 = wrapper3的内存地址
def wrapper2(*args,**kwargs):
print('正在运行===>deco2.wrapper2')
res2=func2(*args,**kwargs)
return res2
return wrapper2
def deco3(x):
def outter3(func3): # func3=被装饰对象index函数的内存地址
def wrapper3(*args,**kwargs):
print('正在运行===>deco3.outter3.wrapper3')
res3=func3(*args,**kwargs)
return res3
return wrapper3
return outter3
加载分析:
由下而上,可以理解为就近原则,离定义原函数越近的装饰器越先加载。
@deco1 #index=outter1(wrapper2的内存地址)-->index=wrapper1的内存地址
@deco2 #index=outter2(wrapper3的内存地址)-->index=wrapper2的内存地址
@deco3(222) #-->@outter3-->index=outter3(index)-->index=wrapper3的内存地址
def index(x,y):
print(f'from index {x} {y}')
执行顺序:
自上而下的执行顺