Decorator模式采用你的函数,用其他东西装饰它并返回一个新的装饰函数,这是我理解的东西。
但是当谈到Python时,我发现装饰器的实现差别不大。我们假设我们有以下代码:
def helloWorld(func):
print(func() + 1)
@helloWorld
def hello():
return 2
我的基本期望是通过说hello()
来调用此方法,但是,它在某种程度上适用于以下异常:
Traceback (most recent call last):
File "C:/Python34/test.py", line 8, in <module>
hello()
TypeError: 'NoneType' object is not callable
所以基本上,当它命中hello
hello()
的一部分时,它会输出正确的结果并返回None
,就像Python中没有return
语句的任何函数一样。在这种情况下,()
正在尝试调用None
。所以我做了这个,它按照我的预期工作:
def helloWorld(func):
def inside():
print(func() + 1)
return inside
@helloWorld
def hello():
return 2
hello()
我不确定我的期望是否合理。但作为一个来自C#,Java等背景的人,我发现这有点不同。我期待第一个代码中第二个代码示例的行为相同。我错过了什么?为什么这样设计?为什么只说hello
就足以调用装饰器功能?这个设计有什么用?
我希望它能在没有专门返回装饰器中的嵌套函数的情况下工作。因此,在第一个示例中,hello()
可能会像helloWorld
返回嵌套方法一样工作。
答案 0 :(得分:4)
当你这样做时
@helloWorld
def hello():
return 2
Python确实
def hello():
return 2
hello = helloWorld(hello)
所以你好会包含helloWorld返回的内容,在你的第一种情况下你没有返回任何内容(这与返回None
相同)。这就是为什么调用hello()
会给出错误&#39; NoneType&#39;对象不可调用。