You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python父类类属性修改疑问:实例化子类后属性为何“分叉”?

问题解析:Python类属性的"分叉"现象

这是Python类属性继承与赋值机制导致的典型行为,拆解成几个阶段就能明白本质:

1. 初始状态:子类共享父类属性

定义完A和B后,B自身并没有定义my_var属性。当你访问B.my_var时,Python会沿着继承链向上查找,最终读取父类A的my_var(值为0)。此时A.my_var和B.my_var指向同一个内存对象,所以is判断返回True。

2. 实例化A():仅修改父类属性

调用A()时,__init__里的type(self)就是A类本身,执行A.my_var +=1是直接修改A类的my_var属性,将其从0更新为1。这时候B依然没有自己的my_var,访问B.my_var还是会读取A的那个1,两者指向同一个对象,is判断仍为True。

3. 实例化B():子类创建独立属性

调用B()时,type(self)是B类,执行B.my_var +=1的过程分三步:

  • 首先查找B.my_var,发现B没有自己的该属性,于是从父类A读取当前值1;
  • 执行加1操作得到新值2;
  • 关键逻辑:Python不会去修改父类A的my_var,而是在B类自己的命名空间中创建一个全新的my_var属性,并把值2赋值给它。

这之后,A.my_var保持原来的1,B.my_var是属于自己的2,两者指向不同的内存对象,所以is判断返回False,也就出现了你看到的"分叉"现象。

核心总结

  • 仅读取子类继承的属性时,子类会共享父类的属性对象;
  • 当给子类的继承属性赋值时,Python会在子类中生成独立的属性,与父类属性彻底分离。

内容的提问来源于stack exchange,提问作者GuyO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:48:15