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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:15:04