为了理解python中的oop,我遇到了一个让我困惑的情况,我无法找到一个令人满意的解释。。。
我正在构建一个Countable类,它有一个counter属性,用于计算初始化了多少个类实例。我希望在初始化给定类的子类(或子类)时也增加此计数器。以下是我的实现:class Countable(object):
counter = 0
def __new__(cls, *args, **kwargs):
cls.increment_counter()
count(cls)
return object.__new__(cls, *args, **kwargs)
@classmethod
def increment_counter(cls):
cls.counter += 1
if cls.__base__ is not object:
cls.__base__.increment_counter()
其中count(cls)用于调试目的,稍后我将其写下来。在
让我们有一些子类:
^{pr2}$
当我运行如下代码时:a = A()
a = A()
a = A()
b = B()
b = B()
a = A()
b2 = B2()
b2 = B2()
我得到了以下输出,在我看来很奇怪:@A Countables: 1 As: 1 Bs: 1 B2s: 1
@A Countables: 2 As: 2 Bs: 2 B2s: 2
@A Countables: 3 As: 3 Bs: 3 B2s: 3
@B Countables: 4 As: 3 Bs: 4 B2s: 4
@B Countables: 5 As: 3 Bs: 5 B2s: 5
@A Countables: 6 As: 4 Bs: 5 B2s: 5
@B2 Countables: 7 As: 4 Bs: 6 B2s: 6
@B2 Countables: 8 As: 4 Bs: 7 B2s: 7
为什么一开始A和B的计数器都在递增,尽管我只调用A()?为什么我第一次调用B()它的行为和预期的一样?在
我已经发现,要有一个我想要的行为,在每个子类中添加counter = 0就足够了,但是我无法找到解释它为什么会这样做。。。。谢谢您!在
我添加了一些调试打印,为了简单起见,将类创建限制为两个。这很奇怪:>>> a = A()
incrementing
increment parent of as well
incrementing
@A Counters: 1 As: 1 Bs: 1 B2s: 1
>>> B.counter
1
>>> B.counter is A.counter
True
>>> b = B()
incrementing
increment parent of as well
incrementing
@B Counters: 2 As: 1 Bs: 2 B2s: 2
>>> B.counter is A.counter
False
为什么当B()还没有初始化时,它指向与A.counter相同的变量,但在创建单个对象之后它是另一个变量?在