我最近租用了python装饰器的主题,发现以下两个不同的程序有些奇怪:
例1:
def deco(func):
def inner():
print("Running inner")
return func
@deco
def target():
print("Running target")
def main():
print("Running main()")
target()
if __name__ == "__main__":
main()
例2:
def deco(func):
print("Running inner")
return func
@deco
def target():
print("Running target")
def main():
print("Running main()")
target()
if __name__ == "__main__":
main()
运行Example1和Example2时,会得到2个不同的结果:
Running main()
Running target
例1中的和
Running inner
Running main()
Running target
例2中的。
似乎"跑步内心"在Example1中丢失了。为什么呢?
答案 0 :(得分:4)
运行示例2将给出该结果,因为deco
在定义时执行,并且在该示例中它立即打印inner
。
示例1不会打印内部因为您从未对inner
func执行任何操作。你的装饰者应该返回inner
,而不是func
;和inner
本身应该调用func:
def deco(func):
def inner():
print("Running inner")
func()
return inner # note change here
执行此操作时,您将获得以下结果:
Running main()
Running inner
Running target
这是你对装饰者的期望。