def outter1(func1): #func1=wrapper2的内存地址
def wrapper1(*args,**kwargs):
print("正在运行--->outter1.wrapper1")
res1=func1(*args,**kwargs) #运行过程中func1=wrapper2的内存地址 即调用运行wrapper2(),此时wrapper1函数还没有运行完
return res1 #wrapper2函数结束了,也就是wrapper1函数结束了
return wrapper1
def outter2(func2): #func2=wrapper3的内存地址
def warpper2(*args,**kwargs):
print("正在运行--->outter2.wrapper2")
res2=func2(*args,**kwargs) #运行过程中func2=wrapper3的内存地址 即调用运行wrapper3(),此时wrapper2函数还没有运行完
return res2 #wrapper3函数结束了,也就是wrapper2函数结束了
return warpper2
def deco3(z): #z=111
def outter3(func3): #func3=被装饰对象index函数的内存地址
def wrapper3(*args,**kwargs):
print("正在运行--->deco3.outter3.wrapper3")
res3=func3(*args,**kwargs) #运行过程中func3=index的内存地址 即调用运行index(),此时wrapper3函数还没有运行完
return res3 #index函数结束了,也就是wrapper3函数结束了
return wrapper3
return outter3
#叠加多个装饰器加载顺序是:自下而上
@outter1 #遇到@outter1将正下方函数内存地址传进来,由于index=wrapper2内存地址 即@outter1(wrapper2内存地址) 然后将返回值赋值给原函数名即index=outter1(wrapper2内存地址)
#函数outter1运行完返回wrapper1内存地址 即index=wrapper1内存地址
@outter2 #遇到@outter2将正下方函数内存地址传进来,由于index=wrapper3内存地址 即@outter2(wrapper3内存地址) 然后将返回值赋值给原函数名即index=outter2(wrapper3内存地址)
#函数outter2运行完返回wrapper2内存地址 即index=wrapper2内存地址
@deco3(111) #遇到@deco3(111) 直接运行deco3(111)函数体代码,函数deco3运行完返回outter3内存地址。即@outter3。遇到@outter3将正下方函数内存地址传进来,然后将返回值赋值给原函数名即index=outter3(index)。
#函数outter3运行完返回wrapper3内存地址 即index=wrapper3内存地址
def index(x,y): #此时调用index()函数执行函数体代码,index函数首先运行结束
print("%s%s"%(x,y))
return 123
#print(index) 没调函数之前打印看一下,是不是被换成outter1.wrapper1的内存地址
# <function outter1.<locals>.wrapper1 at 0x000000000237CA60>
#执行顺序:自上而下 即第一个装饰器的wrapper1-->第二个装饰器的wrapper2-->第三个装饰器的wrapper3(即被装饰对象index函数)
index(1,2) #由于上面分析完index=wrapper1内存地址,所以index(1,2)等于wrapper1(1,2).运行函数wrapper1代码体,在运行过程中去调用运行wrapper2(1,2)