You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())

问题解答

链式装饰器的执行顺序是从下往上的,也就是先处理最靠近目标函数的装饰器,再逐层向上处理。

具体到这段代码的执行流程:

  1. 第一步,@decor 先作用在原num函数上:把num替换成decor(num)返回的inner函数。这个inner函数的逻辑是调用原num得到10,返回2*10=20。
  2. 第二步,@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:39:14