Python静态变量是否支持继承?继承静态变量修改异常问题咨询
问题原因
该现象的核心是Python类继承中可变类属性的查找和修改规则:
- Base类定义的
howManyX = []是可变的列表对象,子类A、B在没有主动覆写howManyX属性的前提下,访问A.howManyX/B.howManyX时都会向上查找到Base类的同名属性,本质上三个类访问的是同一个列表实例。 - 描述符的
__set_name__方法中执行的append是列表的原地修改操作,不会触发子类的属性创建,所有新增的属性名都会追加到Base类的同一个列表里,所以最终三个类的howManyXid相同、内容也完全一致。
实现每个子类独立统计的方案
最简单的实现是用Python 3.6+支持的__init_subclass__钩子,在每个子类创建时自动给子类初始化独立的howManyX列表,修改后的代码如下:
class X: def __set_name__(self, owner, name): owner.howManyX.append(name) class Base: def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # 每个子类创建时自动初始化独立的howManyX列表 cls.howManyX = [] class A(Base): a1 = X() a2 = X() class B(Base): b1 = X() b2 = X() print(id(A.howManyX), A.howManyX ) print(id(B.howManyX), B.howManyX)
修改后的输出效果如下,两个子类的howManyXid不同、内容独立,符合预期:
140703521897152 ['a1', 'a2'] 140703521896704 ['b1', 'b2']
内容的提问来源于stack exchange,提问作者rho
相关产品推荐
相关产品推荐

