def passer1(func): def wrapper1(*args, **kwargs): res = func() return res return wrapper1 def passer2(func): def wrapper2(*args, **kwargs): res = func() return res return wrapper2 def passer3(func): def wrapper3(*args, **kwargs): res = func() return res return wrapper3 @passer3 # 第三步加载 passer3,即((fff = wrapper1)= wrapper2)= wrapper3 @passer2 # 第二步加载 passer2,即(fff = wrapper1)= wrapper2 @passer1 # 第一步加载 passer1,即 fff = wrapper1 def fff(): pass fff() # 执行顺序:执行 wrapper3(内部 wrapper2(内部 wrapper1(内部 fff)))
总结:叠加多个装饰的情况下
加载顺序:较原函数而言,自下而上,由近及远,也就是从内到外。
执行顺序:较原函数而言,自上而下,由远及近,就就是从外到内。