这里有类似的问题,但我找不到任何东西来清楚地回答我的问题。我不明白为什么下面的两块代码会有这样的行为。
因此,无论何时运行文件,都会打印以下代码(注意:我之前在这里有"已保存",但下面的一条注释更正了我(:
def outerFunction(function):
def wrapper():
function()
print('wrapper')
wrapper()
@outerFunction
def innerFunction():
print('innerFunction')
return
但是以下代码需要调用内部函数才能打印:
def outerFunction(function):
def wrapper():
function()
print('wrapper')
return wrapper
@outerFunction
def innerFunction():
print('innerFunction')
return
innerFunction()
为了更好地理解我所做的努力:阅读教程,阅读这里的帖子,修改代码。
我知道,当外部函数被声明为decorator时,它会被自动调用,return wrapper就是这样做的,所以以我的理解水平,我可以编写decorator并使它们工作,但显然,在没有很好地理解它们的情况下这样做是不理想的。我很难理解wrapper((和return wrapper之间的区别。
Decorator语法是函数应用程序的快捷方式。装饰器在执行装饰的def
语句后立即调用,并使用
@outerFunction
def innerFunction():
print('innerFunction')
return
完全等同于(除了一些明显的特定于实现的优化,以减少加载/存储操作的数量(
def innerFunction():
print('innerFunction')
return
innerFunction = outerFunction(innerFunction)
在第一种情况下,不再有绑定到innerFunction
的函数;在执行outerFunction
时立即执行它,然后将值None
绑定到名称innerFunction
。
在第二种情况下,innerFunction
绑定到包装器本身,包装器将调用(每次调用时(原始innerFunction
。