2011-10-14 38 views
8

我有一個類Vec3D(見http://pastebin.com/9Y7YbCZq覆蓋+運營商的Python爲浮動+ OBJ

目前,我讓Vec3D(1,0,0)+ 1.2,但我不知道我應該如何着手超載+運營商以這樣的方式,我得到以下輸出:

>>> 3.3 + Vec3D(1,0,0) 
[4.3, 3.3 , 3.3] 

代碼不是必需的,但只是一個提示我應該看哪個方向。一般的東西會比一個具體的實施更加有用,因爲我需要實現乘法,減法等

+0

我沒有看到「東西將比特定的實現更有用,因爲我需要實現乘法,減法等相同的東西。」部分,但我的答案中的鏈接將帶您到[用於模擬數字類型的魔術方法列表](http://docs.python.org/reference/datamodel.html#emulating-numeric-types)。 – agf

+1

沒關係,我在「您正在尋找__radd__」並點擊鏈接後停止閱讀:) 但是,您的代碼確實使其更加清晰,所以謝謝 –

+0

如果您爲您的課程定製了__add __()那麼在它的定義之後,你可以只包含一行'__radd__ = __add__'。這是有效的,因爲radd會爲您爭取參數順序。 –

回答

10

您正在尋找__radd__同樣的事情:

class MyClass(object): 
    def __init__(self, value): 
     self.value = value 
    def __radd__(self, other): 
     print other, "radd", self.value 
     return self.value + other 


my = MyClass(1) 

print 1 + my 
# 1 radd 1 
# 2 

如果的左邊的對象此外,不支持在右側添加對象,右側的對象將被檢查爲神奇的方法__radd__

3

實施__radd__。當您撥打3.3 + Vec3D(1,0,0)時,只要float沒有方法__add__(y)且y爲Vec3D,則會調用您的反射版本__radd__