类继承

vks*_*vks 4 python class

请考虑以下代码:

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时间?

Luc*_*cas 5

导入模块时执行类主体定义.

这也意味着装饰器也被执行,将apple函数对象传递给A.eat然后将返回值绑定到您传递的函数的名称(apple).

您可以在此处阅读有关Python执行模型的更多信息:https://docs.python.org/2/reference/executionmodel.html


And*_*Guy 5

因为类定义是可执行语句.

类的主体内(但在函数定义之外)中的任何代码都将在运行时执行.

如果您希望只在实例化类对象时运行代码,请将其放在__init__类方法中.

请注意,有些教程会出错,这无疑会增加混乱:

定义类时不运行代码 - 您只是创建函数和变量.

这是完全错误的.