【发布时间】:2017-06-06 11:04:19
【问题描述】:
我的理解:
根据我对装饰器的理解,下面的代码
def myDecorator(func):
...
@myDecorator
def myFunc()
等价于
myFunc = myDecorator(myFunc)
我的实验
所以我用下面的代码玩弄这个概念
def myDecorator(func):
func()
@myDecorator
def myFunc():
print("MyFunc is run")
@myDecorator
def myFunc2():
print("MyFunc2 is run")
myFunc
输出是
MyFunc is run
MyFunc2 is run
我的问题
会发生什么?为什么要打印MyFunc2 is run 行? myFunc不等于myFunc = myDecorator(myFunc)吗?如果是这种情况,为什么要运行myFunc2 语句?
【问题讨论】:
-
为什么不呢?函数也是对象,你将
MyFunc2()传递给装饰器函数,它以func接收它。然后你打电话给func()。 -
You're last line with
myFunc不运行该功能。您缺少括号。 -
@Matthias 在这种情况下它不需要括号,因为 myDecorator 已经调用了函数
-
这就是我想要解释的。
myFunc行不会导致任何操作,因此导致打印的调用在另一个地方完成。 -
@MartijnPieters 不应该只在我添加另一行
myFunc2时触发 myFunc2(我刚刚将代码从 MyFunc2 编辑到 myFunc2,错字)?为什么我只发出声明myFunc时会调用它?
标签: python python-3.x python-decorators