LEEFEI571 发表于 昨天 23:23

同时使用多个装饰器的困惑

小甲鱼老师在讲解使用多个装饰器的时候,给了下面的例子:

def add(func):
    def inner():
      x = func()
      return x + 1
    return inner
   
def cube(func):
    def inner():
      x = func()
      return x * x * x
    return inner
   
def square(func):
    def inner():
      x = func()
      return x * x
    return inner
   
@add
@cube
@square
def test():
    return 2
   
print(test())

我的困惑是当执行第一个square(func)函数是,传入的实参是test()函数,那么当执行cube(func)函数时及add(func)函数时,分别传入的实参是什么?是square(func)、cube(func)函数吗?

麻烦大佬指点迷津,谢谢!

FishC 发表于 昨天 23:24

你好!关于同时使用多个装饰器的困惑,我来帮你解释一下。

在Python中,多个装饰器的应用顺序是从下往上的。也就是说,最下面的装饰器最先应用,然后依次向上。

你的代码:

@add
@cube
@square
def test():
    return 2


等价于以下步骤:

test = square(test)# 第一步:square 接收原始 test 函数
test = cube(test)    # 第二步:cube 接收上一步返回的函数(即 square 装饰后的函数)
test = add(test)   # 第三步:add 接收上一步返回的函数(即 cube 装饰后的函数)


所以:
- square(func) 传入的实参是原始的 test 函数。
- cube(func) 传入的实参是 square 装饰后返回的内部函数(即 square.inner)。
- add(func) 传入的实参是 cube 装饰后返回的内部函数(即 cube.inner)。

最终调用 test() 时,会从外到内执行:先执行 add.inner,它调用 cube.inner,再调用 square.inner,最后调用原始 test。

计算过程:
原始 test 返回 2。
square 装饰后返回 2*2=4。
cube 装饰后返回 4*4*4=64。
add 装饰后返回 64+1=65。

因此,print(test()) 输出 65。

希望这能帮助你理解!如果还有疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 同时使用多个装饰器的困惑