You need to enable JavaScript to run this app. 两个子类继承同一基类,修改一个实例变量为何另一个也会变更?
优惠活动
大模型
产品
解决方案
定价
更多

两个子类继承同一基类,修改一个实例变量为何另一个也会变更?

核心问题原因
  • 你将accounts定义为了BaseClass的类变量,类变量属于类本身,所有继承自该类的子类、以及所有类实例共享同一份内存存储,任意一处修改都会同步到所有实例的访问结果中
  • 你在代码中调用self.accounts时,由于实例本身没有绑定accounts属性,Python会自动向上查找父类的类属性,所以c1.accounts和c2.accounts指向的是同一个字典对象,你可以通过打印id(c1.accounts)和id(c2.accounts)验证两者完全相同
  • 你给子类加__init__调用父类构造没有生效,是因为父类默认没有实现构造方法初始化实例级别的accounts,实例查找属性时仍然会命中共享的类变量
修复方案

修改BaseClass,在构造方法中为每个实例初始化独立的accounts属性即可:

class BaseClass(object):
    def __init__(self):
        # 绑定到self的是实例变量,每个实例独有一份
        self.accounts = dict()
    
    def AddAccount(self, account_id, account_var):
        if account_id in self.accounts:
            raise Exception('Account already exists')
        self.accounts[account_id] = account_var
        
class Class1(BaseClass):
    pass

class Class2(BaseClass):
    pass

ACCOUNT_ID = '123'
c1 = Class1()
c2 = Class2()

c1.AddAccount(ACCOUNT_ID, 'abc')
c2.AddAccount(ACCOUNT_ID, 'abc') # 运行正常,不会抛出异常

补充小优化:判断键是否存在不需要调用.keys(),直接if account_id in self.accounts即可,新增键值对也不需要用update,直接赋值写法更简洁。

内容的提问来源于stack exchange,提问作者elidio xg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 13:54:07