两个子类继承同一基类,修改一个实例变量为何另一个也会变更?
核心问题原因
- 你将
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
相关产品推荐
相关产品推荐

