考虑以下代码:

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 为空,因为我们甚至还没有创建对象。如何在此处添加 2 函数?究竟是什么导致 eat 被称为 2 次?

最佳答案

因为 class definition is an executable statement

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

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

请注意 some tutorials 弄错了,这无疑增加了困惑:



这简直是​​错误的。

关于python - 类继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42359156/

10-12 19:31