2017-09-26 141 views
0

我正在通过实验示例研究装饰器和包装器,我发现装饰器的行为,我不明白。python装饰器和包装函数调试

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! 

回答

1

的装饰,而包装时执行代码运行当你的代码负载,执行。如果我倾倒你的第二个例子到一个文件example.py并运行它像这样:

pythohn -i example.py 

我看到:

wrapper is executed before display 
>>> 

所运行的装饰。现在,如果我叫display(),我看到输出从功能:

>>> display() 
display function ran! 
>>> 

我不从这里看到的装饰,因为它已经跑了输出。

+0

更确切地说,“包装被执行”是在定义'display'时(这是'decorator_function'实际执行时)打印的。 – chepner