实现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
相关产品推荐
相关产品推荐

