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

实现Python Indicator类相加结果随原对象自动更新

问题描述

我想要创建一个Python类Indicator,实现__add__方法以支持同类型对象相加。该类仅包含一个属性elements,是存储整数值的字典。

我当前的__add__实现会合并两个对象的elements属性,对相同键的值进行求和:

from __future__ import annotations
import copy
class Indicator:
    def __init__(self, elements={}):
        self.elements = elements

    def __add__(self, other: Indicator):
        new = copy.deepcopy(self)
        new.values =  {k: self.elements.get(k, 0) + other.elements.get(k, 0) for k in set(self.elements) | set(other.elements)}
        return new

ind1 = Indicator({1:1,2:2,3:3})
ind2 = Indicator({1:1,2:2})

new = ind1 + ind2
print('ind1: ',ind1.elements)
print('ind2: ',ind2.elements)
print(new.elements) # {1: 2, 2: 4, 3: 3}

我希望__add__返回的对象,其elements属性能随求和中的一个或两个原对象更新而同步更新。例如:

ind1.elements[4] = 4
print(new.elements) # 期望输出 {1: 2, 2: 4, 3: 3, 4:4}

ind1.elements[1] = 3
print(new.elements) # 期望输出 {1: 4, 2: 4, 3: 3, 4:4}

该如何实现?

编辑

感谢各位的评论与解答,我根据建议提出了一个解决方案:给Indicator类添加两个列表属性self.adds和self.linked。

  • self.adds存储求和的加数对象,调用__add__时填充。例如ind1.adds和ind2.adds为空列表,而new.adds为[ind1,ind2]
  • self.linked存储所有需要随当前对象更新而同步的对象。例如ind1.linked和ind2.linked均为[new]

但我对该方案并不完全满意,比如当三个对象相加后修改其中一个时,方案会失效。我可以尝试修复代码,但不确定该方案是否非常规,希望得到相关建议。代码如下:

from __future__ import annotations
import copy


class Indicator:
    def __init__(self, elements=None):
        if elements is None:
            self._elements = {}
        else:
            self._elements = elements
        self.adds = []
        self.linked = []

    @property
    def elements(self):
        return self._elements

    @elements.setter
    def elements(self, value):
        self._elements = value
        for i in range(len(self.linked)):
            el = self.linked[i]
            el.update()

    def update(self):
        summation = self.adds[0]
        for obj in self.adds[1:]:
            summation = summation.__add__(obj)
        self._elements = summation.elements

    def __add__(self, other: Indicator):
        new = copy.deepcopy(self)
        self.linked.append(new)
        other.linked.append(new)
        new.adds = [self, other]
        new._elements = {k: self.elements.get(k, 0) + other.elements.get(k, 0) for k in
                         set(self.elements) | set(other.elements)}
        return new


ind1 = Indicator({1: 1, 2: 2, 3: 3})
ind2 = Indicator({1: 1, 2: 2})

new = ind1 + ind2
print('ind1: ', ind1.elements)
print('ind2: ', ind2.elements)
print(new.elements)  # {1: 2, 2: 4, 3: 3}
ind1.elements = {0: 0, 1: 3}
print('Updating ind1: ',new.elements == (ind1+ind2).elements)

ind2.elements = {0: 0, 7: 9}
print('Updating ind2: ',new.elements == (ind1+ind2).elements)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:40:16