【问题标题】:Python 2.7 - inheritance - class methods - class attributesPython 2.7 - 继承 - 类方法 - 类属性
【发布时间】:2024-01-08 00:42:01
【问题描述】:

假设我有以下代码:

class Parent(object):
    counter = 0

    @classmethod
    def inc(cls):
        cls.counter += 1

class Child(Parent):
    pass

Child.inc()
print Parent.counter, Child.counter

在我的测试中,这段代码输出: 0 1

似乎上面的代码会在孩子身上创建一个属性计数器并增加它。我试过使用 super :

class Child(Parent):
    @classmethod
    def inc(cls):
        super(Child,cls).inc()

但结果是一样的。

如何使 inc 方法增加父级,以使父级和子级都保持相同的计数器并打印: 1 1

提前致谢。

【问题讨论】:

  • 如果要增加Parent.counter,请参考Parent.counter,而不是cls.counter

标签: python-2.7 inheritance class-method class-attributes


【解决方案1】:

类方法绑定到当前类;这是设计使然;所以调用Parent.inc()cls 绑定到Parent,并且Child.inc()cls 绑定到Child。那么在后一种情况下,表达式

cls.counter += 1

与以下内容基本相同:

cls.counter = cls.counter + 1

一开始读取Parent.counter(因为Child.counter不存在),但随后写入Child.counter

如果您只想更新Parent.counter,请使用对类的显式引用:

class Parent(object):
    counter = 0

    @classmethod
    def inc(cls):
        Parent.counter += 1

并忽略cls 属性。

【讨论】: