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
相关产品推荐
相关产品推荐

