如何让 __radd__ 使用 numpy 数组

Jon*_*han 5 python arrays math numpy

考虑以下python代码:

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

p = MyClass()
Run Code Online (Sandbox Code Playgroud)

要唤起 radd,可以运行以下命令:

>>> print "bar"+p
foo bar
bar
Run Code Online (Sandbox Code Playgroud)

这是预期的行为。__add__运行并失败,因此__radd__接管并处理情况。但是对于 numpy 数组,它的行为略有不同:

>>> v = np.arange(2)
>>> print v+p
foo 0.
foo 1.
[0. 1.]
Run Code Online (Sandbox Code Playgroud)

似乎与上面的示例不同,v.__add__迭代地遍历v的组件并p.__radd__在它们上执行。换句话说,它决定返回类型是 an ndarray(只要代码不崩溃)。我知道这是试图变得聪明的 numpy,但有时我希望我的班级处理算术。

是否可以__radd__使用 numpy 数组获得标准行为?

Tho*_*s K 2

当您这样做时a+b,通常首先会定义这意味着什么:只有在未实现b.__radd__时才会使用。a.__add__所以,在一般情况下,如果你想控制加法,你必须确保你把你的对象放在第一位:b+a

不过,根据文档,有一个例外。如果您子类化numpy.ndarray并定义一个__radd__方法,那么首先会尝试该方法。因此,如果您的对象基于数组有意义,您就可以这样做。