我有一个计算移动平均值的类,这个类可能会得到改进。平均窗口的大小必须是灵活的。
它当前的工作方式是设置窗口大小,然后发送更新:
twoday = MovingAverage(2) # twoday.value is None
twoday = twoday.update(10) # twoday.value is None
twoday = twoday.update(20) # twoday.value == 15
twoday = twoday.update(30) # twoday.value == 25
我想如果它能像这样工作会很酷的:
twoday = MovingAverage(2) # twoday is None
twoday += 10 # twoday is None
twoday += 20 # twoday == 15
twoday += 30 # twoday == 25
这愚蠢吗?
有可能吗?
最佳答案
您可以通过添加一些方法(如__add__()
)来emulate numeric types,这些方法正是您想要的。
只需添加以下方法
def __iadd__(self, other):
self.update(other)
return self
def __add__(self, other):
return self.value + other
def __str__(self):
return str(self.value)
你现在拥有的。
如果您想接近float的功能,可以添加如下方法
def __float__(self):
return self.value
def __radd__(self, other):
return other + self.value
(后者提供了一种方法来执行
somevalue + twoday
并获得预期值)和
__mul__/__rmul__
,与div相同,以此类推。你唯一的特例可能是上面提到的__iadd__()
。