我是春鸡 发表于 2024-11-6 22:55:07

关于装饰器return的问题

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 就是没有参数的?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

很cool的阳 发表于 2024-11-7 10:14:35

return inner 和 return outer 实际上是在返回函数对象,而不是函数的调用结果。这些返回的函数对象(inner 和 outer)在之后可以被调用,并接受相应的参数。

jackz007 发表于 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() 函数输出字符串
页: [1]
查看完整版本: 关于装饰器return的问题