【发布时间】:2020-04-16 22:31:46
【问题描述】:
我正在尝试了解 Python 中的装饰器。我已经从 SO: 上的各种答案 [ex] 中了解了它们的用途:在修饰函数之前和/或之后运行代码而不修改函数本身。也就是说,我无法理解返回函数对象的含义。
返回函数的返回值和返回函数对象有什么区别?我知道返回了对函数本身的引用,但是这种行为的用处是什么?
我没有使用下面的 @Decorator 语法,因为我还在学习。
例如:
def some_func():
print('returning 1')
return 1
def Decorator(func):
def Wrapper():
print('doing something first')
val = func()
print('doing something after')
return val
return Wrapper
Decorated_func = Decorator(some_func)
Decorated_func()
在 PythonTutor 中单步执行:调用 Decorated_func() 表明 Wrapper 的返回值为 1,Decorator 的返回值为 Wrapper。这是否意味着Decorator 实际上 在调用Decorated_func() 时返回值为1?我原以为该行为的语法是(在Decorator 内)return Wrapper()。返回函数对象有什么意义?
【问题讨论】:
-
函数只是一个对象,就像一个列表或一个整数。它与从函数返回任何其他对象的目的相同。
-
看来你真的在问“为什么高阶函数有用?”
-
如果你返回
Wrapper()然后Decorated_func == 1并且它不会是一个函数......尝试这样做,然后看看当你尝试使用Decorated_func作为函数时会发生什么 -
@Brian 是的,OP 甚至提供了一个有用的例子。
-
而 no,这 不意味着
Decorator实际上的返回值是1,返回值是您在Decorator中创建的包装函数