2011-05-25 100 views
3

考慮以下Python代碼工作:如何獲得__radd__與numpy的陣列

class MyClass: 
    def __radd__(self, a): 
     print "foo", a 
     return a 

p = MyClass() 

爲了喚起RADD下面就可以運行:

>>> print "bar"+p 
foo bar 
bar 

這是預期的行爲。 __add__運行並失敗,因此__radd__接管並處理該情況。 但隨着numpy的陣列,它的行爲稍有不同:

>>> v = np.arange(2) 
>>> print v+p 
foo 0. 
foo 1. 
[0. 1.] 

似乎不像上面v.__add__的例子itterativly通過v的組件和performes p.__radd__他們去。換句話說,它決定返回類型將是ndarray(只要代碼不會崩潰)。我知道這是一種努力變得聰明的努力,但有時我希望我的班級能夠處理這種情況。

是否有可能使用numpy數組獲得標準__radd__行爲?

回答

2

當你做a+b時,通常會先定義這個意思:b.__radd__只有在a.__add__沒有實現時纔會使用。因此,在一般情況下,如果您想要控制添加,您必須確保先放置對象:b+a

根據the docs,雖然有一個例外。如果您繼承了numpy.ndarray,並定義了__radd__方法,則首先嚐試該方法。所以,如果你的對象基於數組是有意義的,你可以這樣做。

+0

它具有相當的意義。 – Jonathan 2011-05-26 09:32:18

+0

它雖然創建了一個新問題。子集在創建時會產生一個錯誤:'TypeError:requires argument'shape'(pos 1)not found'。定製'__init__'是我的第一個想法,但沒有用。有沒有辦法解決這個問題(例如通過黑客攻擊__new__)? – Jonathan 2011-05-26 09:44:35

+0

我不確切知道numpy是如何工作的,但是可能會覆蓋'__new__'來解決問題。 – 2011-05-26 11:32:33