Python链式装饰器代码输出400存疑,请求解释原因
解释Python链式装饰器的执行逻辑
先看你的代码:
def decor1(func): def inner(): x = func() return x * x return inner def decor(func): def inner(): x = func() return 2 * x return inner @decor1 @decor def num(): return 10 print(num())
问题解答
链式装饰器的执行顺序是从下往上的,也就是先处理最靠近目标函数的装饰器,再逐层向上处理。
具体到这段代码的执行流程:
- 第一步,
@decor先作用在原num函数上:把num替换成decor(num)返回的inner函数。这个inner函数的逻辑是调用原num得到10,返回2*10=20。 - 第二步,
@decor1作用在已经被decor装饰过的num函数上:把它替换成decor1(被装饰后的num)返回的inner函数。这个inner函数的逻辑是调用前一步得到的inner函数(也就是decor的inner)得到20,返回20*20=400。
所以最终调用num()时,实际是触发了一层套一层的嵌套调用:decor1.inner() → decor.inner() → 原num(),最终计算得到400。这不是inner函数被返回两次,而是装饰器通过层层包裹,形成了嵌套的函数调用结构。
内容的提问来源于stack exchange,提问作者brian.p
相关产品推荐
相关产品推荐

