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
属性。
假设我有以下代码:
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
属性。