【发布时间】:2017-09-28 06:51:05
【问题描述】:
我正在尝试了解装饰器的行为。 我知道装饰器必须返回一个对象,所以我可以理解下面的语法:
def my_deco(fonction):
print("Deco is called with parameter the function {0}".format(fonction))
return fonction
@my_deco
def hello():
print("hello !")
Deco is called with parameter the function <function salut at 0x00BA5198>
这里装饰器做的不多,但是如果我需要修改功能,我会定义一个这样的装饰器
def my_deco(fonction):
def modified_func():
print("Warning ! calling {0}".format(fonction))
return fonction()
return modified_func
@my_deco
def hello():
print("Salut !")
通过modified_func修改初始函数行为。这样就可以了
它包括对初始函数的调用。这很好
现在我不明白的是:为什么我们要返回函数的结果?在我的情况下,该函数是一个简单的“打印”,所以我不明白为什么我应该返回一些东西
感谢您的解释
【问题讨论】:
-
因为您可以将装饰器应用于 any 函数,而那些其他函数很可能有返回值。另请参阅:支持任意参数。
-
严格来说你不必
return fonction()。您可以改为调用它,例如fonction()并丢弃结果,或者在适当的情况下根本不调用fonction。它是你的装饰器,所以你可以决定什么是有意义的。问问自己这个问题:fonction的调用者是否应该期待一个明显不同的结果,如果它被装饰了?如果答案是“否”(通常是这样),那么装饰器返回的函数可能应该返回fonction的结果。 -
感谢 jq170727 的解释