装饰问题

时间:2011-01-27 15:02:05

标签: python decorator

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)

我有Debug IO

I am a ordinary function

我不明白为什么有任何输出。我理解为什么这一行:

functionDecorator()

给我回复:

I am function returned by the decorator
another___zzzzzzzz

但其余的我认为我错过了什么

2 个答案:

答案 0 :(得分:5)

当您第一次致电my_decorator时,在它返回功能wrapper之前,它会打印您的消息。

再次尝试调用functionDecorator(),您将无法再次获得输出,因为该函数已由my_decorator修饰。但是,每次调用my_decorator时,它都会打印您的消息,因为它是一个正常的函数调用(恰好还会返回一个修饰函数)。

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

答案 1 :(得分:4)

Decorator是一个普通函数,它接受另一个函数并返回一些修改过的函数。

致电时:

functionDecorator=my_decorator(lazy_function)
装饰器内的

代码会立即执行,因此执行print语句,创建并返回新函数。然后,当你运行修饰函数(它只是一个在装饰器内部构建的新函数)时,只执行内部打印并且不再执行外部函数。那是清楚的吗?