考虑以下代码:
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输出:called <function apple at 0x1048fba28> called <function <lambda> at 0x1048fbaa0> [<function apple at 0x1048fba28>, <function <lambda> at 0x1048fbaa0>]
我以为A.a是空的,因为我们还没有创建一个object.How,2函数在这里被添加了吗?究竟是什么导致eat被称为2时间?
发布于 2017-02-21 05:20:44
因为一个类定义是可执行语句。。
类主体内的任何代码(但在函数定义之外)都将在运行时执行。
如果希望只在类对象被实例化时运行代码,请将其放入__init__类方法中。
请注意,一些教程错了,这无疑增加了混淆:
定义类时不运行代码--您只是在创建函数和变量。
这是完全错误的。
发布于 2017-02-21 05:14:31
导入模块时执行类体定义。
这也意味着还将执行装饰器,将apple函数对象传递给A.eat,然后将返回值绑定到您传递的函数的名称(apple)。
您可以在这里更多地了解Python的执行模型:https://docs.python.org/2/reference/executionmodel.html
https://stackoverflow.com/questions/42359156
复制相似问题