2012-07-31 130 views
2

我有一個類可以計算一個可能可以改善的移動平均數。平均窗口的大小必須靈活。因此 它目前是通過設置窗口,然後將其發送的大小更新:我可以創建一個類似不可變(float)的類嗎?

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 

這是愚蠢的? 這可能嗎?

回答

6

您可以通過添加__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) 

一下您目前擁有的方法。

如果你想接近什麼浮動呢,比如

def __float__(self): 
    return self.value 

def __radd__(self, other): 
    return other + self.value 

(後者給你一個辦法做到somevalue + twoday並獲得預期值)

,你可以添加方法和__mul__/__rmul__,與div相同,依此類推。你唯一的特例可能是上面提到的__iadd__()

+0

謝謝。我也看到了這一點,並認爲它,但因爲這是我第一次害怕 - - )...但另一個問題是訪問器...使用實例名稱「twoday」而不是「twoday.value」檢索當前值「? – 2012-07-31 08:47:14

+1

'__iadd__'可能是你的意思 – jamylak 2012-07-31 08:48:16

+0

@JohnMee:這取決於你的意思是「檢索」。您可以將您的'MovingAverage'類設置爲在打印時使用其當前值,或者將其轉換爲字符串(通過給它一個'__str__'方法),但無法以任何方式使它像整數一樣運行,重新賦予添加事物的特殊含義。你可能需要選擇一個或另一個! – Blckknght 2012-07-31 08:52:10

相關問題