我有一个计算移动平均线的类(class),这可能会有所改进。平均窗口的大小必须是灵活的。 它目前通过设置窗口的大小然后发送更新来工作:
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
这是愚蠢的吗? 可能吗?
最佳答案
您可以 emulate numeric types通过添加诸如 __add__()
之类的方法,它完全可以满足您的需求。
只需添加方法如
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__()
。
关于python - 我可以创建一个行为类似于不可变( float )的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11736191/