鱼C论坛

 找回密码
 立即注册
查看: 80|回复: 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函数中的形参啊?从这里开始我就不明白了,麻烦大神帮忙指点,谢谢!





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

假设你有以下装饰器和函数:
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())

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

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` 函数会计算传入函数的结果加一。

因此,实际执行过程相当于以下的嵌套调用:
def test():
    return 2

# Applying @square
test = square(test)

# Applying @cube
test = cube(test)

# Applying @add
test = add(test)

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

1. 最外层的 `inner` 函数(来自 `add` 装饰器)调用:
x = inner_from_cube()
2. 中间层的 `inner` 函数(来自 `cube` 装饰器)调用:
x = inner_from_square()
3. 最内层的 `inner` 函数(来自 `square` 装饰器)调用:
x = test()  # which returns 2
   x = 2 * 2  # square: 4
4. 回到中间层的 `inner` 函数:
x = 4 * 4 * 4  # cube: 64
5. 回到最外层的 `inner` 函数:
x = 64 + 1  # add: 65

最终结果是 `65`。

简化解释:

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

请问一下,你和DEEPSEEK谁厉害一些
DEEPSEEK都能把gpt忽悠了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-24 01:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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