Python 2.7 - 继承 - class 方法 - class 属性

Python 2.7 - inheritance - class methods - class attributes

假设我有以下代码:

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

上面的代码似乎会在 child 上创建一个属性计数器并递增它。我试过使用 super 作为:

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

但是结果是一样的

如何使 inc 方法递增 Parent,使 Parent 和 Child 都使用相同的计数器并打印: 1 1

提前致谢。

Class 方法绑定到 当前 class;那是设计使然;所以调用 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:

的显式引用
class Parent(object):
    counter = 0

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

并忽略 cls 属性。