请考虑以下代码:
class A(object):
a = []
@classmethod
def eat(cls, func):
print "called", func
cls.a.append(func)
class B(A):
@A.eat
def apple(self, x):
print x
A.eat(lambda x: x + 1)
print A.a
Run Code Online (Sandbox Code Playgroud)
输出:
called <function apple at 0x1048fba28>
called <function <lambda> at 0x1048fbaa0>
[<function apple at 0x1048fba28>, <function <lambda> at 0x1048fbaa0>]
我希望A.a它是空的,因为我们甚至没有创建一个对象.2如何在这里添加函数?究竟是什么导致eat被调用的2时间?
导入模块时执行类主体定义.
这也意味着装饰器也被执行,将apple函数对象传递给A.eat然后将返回值绑定到您传递的函数的名称(apple).
您可以在此处阅读有关Python执行模型的更多信息:https://docs.python.org/2/reference/executionmodel.html