python类变量继承_python中类变量的继承

为了理解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相同的变量,但在创建单个对象之后它是另一个变量?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值