2011-05-25 142 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