为何Python装饰器执行结果为400而非200?求技术解释
Python装饰器执行结果解析:为什么输出是400而非200?
先看原代码:
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())
问题核心在于装饰器的叠加执行顺序:Python中多个装饰器是从下往上生效的——离被装饰函数越近的装饰器,越先执行。
具体执行流程拆解:
- 第一步,先执行
@decor装饰num函数:原num返回10,被decor包装后,调用时会先拿到原num的返回值10,再返回2*10=20。此时num已经变成了decor内部的inner函数,执行它会得到20。 - 第二步,再执行
@decor1装饰这个已经被decor处理过的函数:decor1的内部inner会调用这个“返回20”的函数,拿到20后返回20*20=400。
所以最终调用num()时,实际是执行了decor1的inner,结果自然是400。
如果想得到预期的200,只需要调换两个装饰器的顺序:把@decor放在@decor1上面,这样先执行平方(1010=100),再乘2(1002=200)。
内容的提问来源于stack exchange,提问作者Sv Prince
相关产品推荐
相关产品推荐

