装饰器方法用Python设计决策

时间:2014-05-07 19:12:05

标签: python

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返回嵌套方法一样工作。

1 个答案:

答案 0 :(得分:4)

当你这样做时

@helloWorld
def hello():
    return 2

Python确实

def hello():
    return 2
hello = helloWorld(hello)

所以你好会包含helloWorld返回的内容,在你的第一种情况下你没有返回任何内容(这与返回None相同)。这就是为什么调用hello()会给出错误&#39; NoneType&#39;对象不可调用。