我有一個類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]
代碼不是必需的,但只是一個提示我應該看哪個方向。一般的東西會比一個具體的實施更加有用,因爲我需要實現乘法,減法等
我有一個類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]
代碼不是必需的,但只是一個提示我應該看哪個方向。一般的東西會比一個具體的實施更加有用,因爲我需要實現乘法,減法等
您正在尋找__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__
。
您想要使用__add__
(可能還有__radd__
和__iadd__
)方法。查看http://docs.python.org/reference/datamodel.html#object.__add__瞭解更多詳情。
如果你看他的問題和他鏈接的代碼,他已經在使用'__add__'。 – agf
好點。我錯過了。 –
實施__radd__
。當您撥打3.3 + Vec3D(1,0,0)
時,只要float沒有方法__add__(y)
且y爲Vec3D,則會調用您的反射版本__radd__
。
我沒有看到「東西將比特定的實現更有用,因爲我需要實現乘法,減法等相同的東西。」部分,但我的答案中的鏈接將帶您到[用於模擬數字類型的魔術方法列表](http://docs.python.org/reference/datamodel.html#emulating-numeric-types)。 – agf
沒關係,我在「您正在尋找__radd__」並點擊鏈接後停止閱讀:) 但是,您的代碼確實使其更加清晰,所以謝謝 –
如果您爲您的課程定製了__add __()那麼在它的定義之後,你可以只包含一行'__radd__ = __add__'。這是有效的,因爲radd會爲您爭取參數順序。 –