鱼C论坛

 找回密码
 立即注册
查看: 268|回复: 3

多个装饰器同时用在同一个函数上的困惑

[复制链接]
发表于 2025-2-8 21:40:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼老师在讲解装饰器函数的时候给了以下例子:
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())
>>>65

在执行第一个装饰器@square时,实参test()函数被塞到形参func中,并在执行内部函数inner()时把2赋值给x,然后返回x的平方,即4.此时test()函数已经执行完毕.然后再执行第二个装饰@cube时,应该是没有可用函数放进cube函数中的形参啊?从这里开始我就不明白了,麻烦大神帮忙指点,谢谢!





小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-8 21:40:44 | 显示全部楼层
当然可以解释这个过程,以下是详细的步骤解析:

假设你有以下装饰器和函数:

  1. def add(func):
  2.     def inner():
  3.         x = func()
  4.         return x + 1
  5.     return inner

  6. def cube(func):
  7.     def inner():
  8.         x = func()
  9.         return x * x * x
  10.     return inner

  11. def square(func):
  12.     def inner():
  13.         x = func()
  14.         return x * x
  15.     return inner

  16. @add
  17. @cube
  18. @square
  19. def test():
  20.     return 2

  21. print(test())
复制代码


当你运行这段代码时,实际发生的事情如下:

1. **最内层的装饰器 @square**:
   - `test` 函数首先被 `square` 装饰。
   - `square(test)` 调用后返回 `inner` 函数,这个 `inner` 函数会计算 `test()` 的结果平方。

2. **中间层的装饰器 @cube**:
   - 上一步得到的 `inner` 函数(由 `square` 返回)作为参数传递给 `cube` 装饰器。
   - `cube(inner)` 调用后返回一个新的 `inner` 函数,这个新的 `inner` 函数会计算传入函数的结果立方。

3. **外层的装饰器 @add**:
   - 上一步得到的 `inner` 函数(由 `cube` 返回)作为参数传递给 `add` 装饰器。
   - `add(inner)` 调用后返回一个新的 `inner` 函数,这个新的 `inner` 函数会计算传入函数的结果加一。

因此,实际执行过程相当于以下的嵌套调用:

  1. def test():
  2.     return 2

  3. # Applying @square
  4. test = square(test)

  5. # Applying @cube
  6. test = cube(test)

  7. # Applying @add
  8. test = add(test)
复制代码


所以,当 `print(test())` 被调用时:

1. 最外层的 `inner` 函数(来自 `add` 装饰器)调用:
  
  1. x = inner_from_cube()
复制代码

2. 中间层的 `inner` 函数(来自 `cube` 装饰器)调用:
  
  1. x = inner_from_square()
复制代码

3. 最内层的 `inner` 函数(来自 `square` 装饰器)调用:
  
  1. x = test()  # which returns 2
  2.    x = 2 * 2  # square: 4
复制代码

4. 回到中间层的 `inner` 函数:
  
  1. x = 4 * 4 * 4  # cube: 64
复制代码

5. 回到最外层的 `inner` 函数:
  
  1. x = 64 + 1  # add: 65
复制代码


最终结果是 `65`。

简化解释:

1. `square(test)` 返回一个新函数,计算 `test` 的平方。
2. `cube(返回的新函数)` 再包装,并计算其结果的立方。
3. `add(再返回的新函数)` 再包装,并计算其结果加1。

希望这个解释能够解答你的疑惑!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-10 14:13:44 | 显示全部楼层
FishC 发表于 2025-2-8 21:40
当然可以解释这个过程,以下是详细的步骤解析:

假设你有以下装饰器和函数:

请问一下,你和DEEPSEEK谁厉害一些
DEEPSEEK都能把gpt忽悠了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-10 14:13:48 | 显示全部楼层
wp231957 发表于 2025-02-10 14:13
FishC 发表于 2025-2-8 21:40
当然可以解释这个过程 ...


关于谁更厉害的问题,这主要取决于具体的使用场景和需求。每个工具或老师都有独特的优势和专长。

如果你有具体的编程问题或学习需求,可以提出来,我会尽力帮助你解答!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-6 05:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表