2011-01-27 68 views
1
def my_decorator(func) : 
    print "I am a ordinary function" 
    def wrapper() : 
     print "I am function returned by the decorator" 
     func() 
    return wrapper 
def lazy_function() : 
    print "zzzzzzzz" 

functionDecorator=my_decorator(lazy_function) 

我在调试IO问题与装饰

I am a ordinary function 

我不明白为什么会有任何输出。我明白为什么这条线:

functionDecorator() 

返回我:

I am function returned by the decorator 
another___zzzzzzzz 

但其余我想我错过了什么

+2

您正在调用`my_decorator()`,因此它会被执行。这个函数没什么特别之处 - 它就像你调用的任何函数一样执行。 – 2011-01-27 15:04:45

回答

5

当您第一次致电my_decorator时,在它返回函数wrapper之前,它将打印您的消息。

尝试再次调用functionDecorator(),您将不会再次获得输出,因为该功能已被my_decorator修饰。但是,每次调用my_decorator时,它都会打印您的消息,因为它是一个正常的函数调用(碰巧还会返回一个装饰函数)。

此外,请参阅http://www.python.org/dev/peps/pep-0318/#current-syntax以获取实现装饰器的替代语法。

4

装饰是一个正常功能,这需要另一个函数,返回一些修改功能。

当你拨打:

functionDecorator=my_decorator(lazy_function) 

你的装饰内码立即执行,所以打印语句执行,创建并返回新的功能。然后,当你运行装饰函数(这是一个简单的装饰器内建的新函数)时,只执行内部打印并且外部不再被执行。明白了吗?