Python继承后修改类变量:为何输出不符合预期?
Python类属性继承的查找逻辑解析
先看这段代码的实际运行输出:
1 1 1 1 2 1 3 2 3
输出背后的原因
核心在于Python类属性的查找规则:访问类属性时,会先在自身的属性字典里查找,找不到才会向上遍历父类的属性字典,直到找到对应属性或遍历结束。
第一次输出(1 1 1):
类A定义了val=1,类B和C继承自A,但自身没有定义val属性。所以访问B.val和C.val时,都会去父类A的属性字典里找val,结果全是1。第二次输出不是2 2 2的原因:
执行B.val=2时,是给B类本身新增了专属的val属性,不是修改父类A的val。此时B自己有了val=2,但C仍然没有自己的val,C.val还是会去A里找原来的1,A的val也没变化,所以输出是1 2 1。第三次输出不是3 3 3的原因:
执行A.val=3时,修改的是A类的val属性。B因为已经有了自己的val,访问B.val会优先用自己的2;而C依旧没有自己的val,会去A里找更新后的3,A自己的val也是3,所以输出是3 2 3。
简单说:子类只有在自身没有对应属性时,才会继承父类的属性值;一旦子类给属性赋值,就相当于在自己的空间里创建了这个属性,后续访问就和父类的该属性解绑了。
内容的提问来源于stack exchange,提问作者tru
相关产品推荐
相关产品推荐

