При создании подкласса базового типа, такого как float, возможно ли «пересчитать» или «переназначить» исходное значение?Если у меня есть следующее определение класса,
import collections
class MovingAverage(float):
def __new__(self, initial_value, window):
self.d = collections.deque([initial_value], window)
return float.__new__(self, initial_value)
def add(self, new_value):
self.d.append(new_value)
print sum(self.d) / len(self.d)
# here, I want to _set_ the value of MovingAverage to
# sum(self.d) / len(self.d)
Когда я начинаю с
>>> ma = MovingAverage(10, 3)
>>> ma
10.0
, но
>>> ma.add(3)
6.5
>>> ma
10.0
Другое определение класса, которое я пробовал, это:
import collections
class MovingAverage(float):
def __new__(self, iterable, window):
self.d = collections.deque(iterable, window)
initial_value = sum(iterable) / len(iterable)
return float.__new__(self, initial_value)
def add(self, new_value):
self.d.append(new_value)
return MovingAverage(self.d, self.d.maxlen)
На этот раз, когда я начну с
>>> ma = MovingAverage([10], 3)
>>> ma
10.0
и
>>> ma.add(3)
6.5
>>> ma
10.0
>>> ma = ma.add(3)
>>> ma
5.333333333333333
Однако, я думаю (я не проверял, чтобы выяснить это)это делает это значительно медленнее.Так можно ли это сделать?Можно ли как-то установить его так, чтобы возвращаемое значение ma
было искомым значением?Или мне нужно определить атрибут value
, изменить базовый класс на object
и отказаться от своего предлога о том, что у меня есть шанс контролировать возвращаемое значение класса?