请解释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
相关产品推荐
相关产品推荐

