我通过试验实例来研究装饰器和包装器,我发现装饰器的行为是我无法理解的。
def decorator_function(original_function):
def wrapper_function():
print "wrapper is executed before {}".format(original_function.__name__)
return original_function() # Try it without ()
return wrapper_function
@decorator_function
def display():
print("display function ran!")
当我运行以上功能时:
In [59]: display()
wrapper is executed before display
display function ran!
然而,当我将打印功能移到包装器外面时,似乎包装器根本不会运行。 (可能是它跑了,但我没有看到证据。)
def decorator_function(original_function):
def wrapper_function():
#print "wrapper is executed before {}".format(original_function.__name__)
return original_function() # Try it without ()
print "wrapper is executed before {}".format(original_function.__name__)
return wrapper_function
@decorator_function
def display():
print("display function ran!")
然后我没有看到"包裹物在......之前执行..."了。怎么会? 我在这里缺少什么?
In [63]: display()
display function ran!
答案 0 :(得分:1)
装饰器在代码加载时执行,而包装器在代码运行时执行。如果我将您的第二个示例转储到文件example.py
中并按此运行:
pythohn -i example.py
我明白了:
wrapper is executed before display
>>>
那是装饰者正在运行。现在,如果我调用display()
,我会看到该函数的输出:
>>> display()
display function ran!
>>>
我在这里看不到装饰器的输出,因为它已经运行。