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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:01:57