Python子类修改基类变量时如何让属性引用同步更新
问题原因
当前代码无法达成预期的核心问题出在对象引用和静态赋值逻辑上:
- 父类
__init__执行阶段,self.properties["attrs"]存储的是当时初始化生成的空字典的内存引用。子类调用super().__init__()完成父类初始化后,重新给self.attrs赋值新字典,只是将实例的attrs属性指向了新的内存对象,properties字典中存储的还是旧空字典的引用,不会同步指向新值。 - 原逻辑中
properties是初始化阶段一次性生成的静态字典,字段值都是赋值当时的固定结果,不会随实例属性后续变化自动更新。你当前子类中手动覆盖method字段的操作能生效,但attrs字段没有做同步覆盖,因此始终是父类初始化时的空字典。
正确实现方案
使用@property装饰器将properties定义为动态计算的属性,每次访问时实时读取实例当前的最新属性值,既能自动适配子类对attrs的修改,也能自动识别子类重写的方法,不需要手动做字典覆盖。
完整实现代码:
class Parent(): def __init__(self): # 仅定义attrs的初始值 self.attrs = {} @property def properties(self): # 每次访问时动态生成最新的属性字典 return { "attrs": self.attrs, "method": self.parentMethod(), } def parentMethod(self): return "Parent Method" class Child1(Parent): def __init__(self): super().__init__() # 子类修改attrs初始值 self.attrs = {"name": "Bob"} @property def properties(self): # 复用父类的properties逻辑,仅覆盖需要重写的method字段 base_props = super().properties base_props["method"] = self.childMethod() return base_props def childMethod(self): return "Child1 Method" class Child2(Parent): @property def properties(self): base_props = super().properties base_props["method"] = self.childMethod() return base_props def childMethod(self): return "Child2 Method"
效果验证
执行以下测试代码可以得到符合预期的结果:
c1 = Child1() print(c1.properties) # 输出: {'attrs': {'name': 'Bob'}, 'method': 'Child1 Method'} c2 = Child2() print(c2.properties) # 输出: {'attrs': {}, 'method': 'Child2 Method'} # 实例化后修改attrs值,properties会自动同步 c2.attrs = {"age": 18} print(c2.properties) # 输出: {'attrs': {'age': 18}, 'method': 'Child2 Method'}
不推荐在子类修改
attrs后手动更新self.properties["attrs"]的实现方式,这种方式需要在每一处修改attrs的逻辑后追加同步代码,维护成本高,很容易出现漏改导致的数据不一致问题。
内容的提问来源于stack exchange,提问作者Sal Aslam
相关产品推荐
相关产品推荐

