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
但其余的我认为我错过了什么
答案 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语句,创建并返回新函数。然后,当你运行修饰函数(它只是一个在装饰器内部构建的新函数)时,只执行内部打印并且不再执行外部函数。那是清楚的吗?