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

请解释Python装饰器代码的输出结果3(已知装饰器功能仍存疑)

为什么这段Python装饰器代码的输出是3?

别着急,咱们一步步拆解这段代码,就能搞懂最终输出3的原因了:

1. 装饰器的核心:替换被装饰的函数

当你用@c装饰def fnc(): pass的时候,Python在背后悄悄做了这件事:

fnc = c(fnc)

也就是说,原来的fnc函数已经被替换成了装饰器c返回的inner嵌套函数。现在你调用fnc(),其实是在调用这个inner函数。

2. 装饰器c的初始化操作

看c函数的定义:它接收被装饰的函数f,然后定义了inner函数,并且给inner添加了一个属性co,初始值设为0,最后返回inner。所以现在我们手里的fnc(也就是inner)一开始就有个co属性,值是0。

3. 每次调用fnc()的具体行为

每次调用fnc(),本质是调用inner函数,而inner函数的逻辑很简单:

  • 第一行inner.co += 1:给自己的co属性加1(嵌套函数可以访问自身的属性)
  • 然后执行并返回原fnc函数的结果(这里原fnc只是pass,所以没实际输出)

4. 三次调用后的结果

主程序里一共调用了3次fnc():

  • 第一次调用:inner.co从0 → 1
  • 第二次调用:inner.co从1 → 2
  • 第三次调用:inner.co从2 → 3
    最后打印fnc.co,其实就是打印inner的co属性值,自然就是3了。

内容的提问来源于stack exchange,提问作者Shivam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:06:44