我有一个计算移动平均值的类,这个类可能会得到改进。平均窗口的大小必须是灵活的。
它当前的工作方式是设置窗口大小,然后发送更新:

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__()

10-06 09:11