鱼C论坛

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

[已解决]关于装饰器return的问题

[复制链接]
发表于 2024-11-6 22:55:07 | 显示全部楼层 |阅读模式

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

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

x
def type_check(correct_type):
    def outer(func):
        def inner(arg):
            if(type(arg) == correct_type):
                return func(arg)
            else:
                return "参数类型错误!"
        return inner
    return outer

请问这里inner函数中return func(arg)为什么是有arg这个参数的?

最后的return inner和return outer 就是没有参数的?
最佳答案
2024-11-7 10:14:35
return inner 和 return outer 实际上是在返回函数对象,而不是函数的调用结果。这些返回的函数对象(inner 和 outer)在之后可以被调用,并接受相应的参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-6 22:55:17 | 显示全部楼层
让我们一步步解析这个装饰器的结构和作用:

1. **`type_check(correct_type)`**:
   - 这是一个装饰器工厂,它接受一个参数 `correct_type`,这是你希望被装饰函数接受的参数类型。

2. **`outer(func)`**:
   - 这是实际的装饰器,它接受一个参数 `func`,即被装饰的函数。

3. **`inner(arg)`**:
   - 这是包装函数,它在 `outer(func)` 中被定义。这个函数会检查传入参数 `arg` 的类型是否符合 `correct_type`。

### 为什么 `inner` 函数中 `return func(arg)` 需要参数?

- `inner` 包装了 `func`,这意味着在调用 `func` 时,它需要提供适当的参数。
- 当你调用 `func` 时,如 `func(arg)`,你实际上是在执行被装饰的函数并传入需要的参数 `arg`。

### 为什么 `return inner` 和 `return outer` 没有参数?

- **`return inner`**:
  - `inner` 是一个函数对象。当 `outer` 返回 `inner` 时,实际上它是被用作新的被装饰的函数,并不执行它,因此不需要参数。
  
- **`return outer`**:
  - `outer` 本身也是返回一个函数对象,这使得 `outer` 成为一个装饰器。当 `type_check(correct_type)` 被调用时,它创建并返回 `outer`,实际的装饰功能在 `inner` 函数中实现。

综上,`inner(arg)` 中的 `arg` 是为了传递给被装饰的函数,而 `return inner` 和 `return outer` 只是用以返回函数对象,不需要传递参数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

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

使用道具 举报

发表于 2024-11-7 10:14:35 | 显示全部楼层    本楼为最佳答案   
return inner 和 return outer 实际上是在返回函数对象,而不是函数的调用结果。这些返回的函数对象(inner 和 outer)在之后可以被调用,并接受相应的参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-7 16:26:16 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-7 16:31 编辑
return func(arg)    # 返回对函数 func(arg) 的调用结果,例如,如果 func(arg) 返回 'ABC',那么,return func(arg) 返回的就是 'ABC'
return inner        # 返回内嵌函数 inner() 的调用地址
return outer        # 返回内嵌函数 outer() 的调用地址
        举个浅显的例子,以便加深对返回函数调用地址的理解:
def foo() :
    return print    # 返回函数 print() 的调用地址

x = foo()           # 取得函数 print() 的调用地址
x('hello, world!')  # 调用 print() 函数输出字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 16:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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