Python父子类static变量调用顺序影响结果:此为预期行为吗?
这种因调用顺序导致的静态变量行为差异是Python的预期结果吗?
这确实是Python的预期行为,核心原因在于Python类属性的继承与查找机制,以及类方法中cls参数的作用逻辑:
问题根源拆解
- 类属性的继承查找:
Parent类定义的_value是类属性,子类Child在没有自己定义_value时,会沿着继承链向上查找父类的同名属性。 - 类方法中
cls的赋值逻辑:get_value是类方法,参数cls指向调用该方法的类(调用Child.get_value()时cls是Child,调用Parent.get_value()时cls是Parent)。当执行cls._value = i时:- 如果先调用
Child.get_value():此时Child没有自己的_value,但赋值操作会直接在Child类上创建一个新的_value属性,和父类Parent的_value彻底分开。后续调用Parent.get_value()时,Parent的_value还是None,会被赋值为2,所以输出1和2。 - 如果先调用
Parent.get_value():此时给Parent的_value赋值为1。后续调用Child.get_value()时,Child自身没有_value,会向上找到Parent的_value(已经是1,非None),直接返回这个值,所以输出1和1。
- 如果先调用
解决方法:让子类拥有独立的类属性
如果希望父类和子类的_value完全独立,不受调用顺序影响,最简单的方式是在子类中显式定义同名的类属性:
class Child(Parent): _value = None # 显式定义,切断与父类属性的关联
这样不管调用顺序如何,Parent和Child的_value都是各自独立的,调用get_value()都会得到各自的递增结果。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

