如何使__radd__与numpy数组一起使用

问题描述

|| 考虑以下python代码
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__
巧妙地遍历
v
的组件并对其执行perform7ѭ。换句话说,它已决定返回的类型将是
ndarray
(只要代码不会崩溃)。我得到的是,这很麻木,试图变得聪明,但是有时我希望我的班级处理杂技。 是否可以通过numpy数组获得标准
__radd__
行为?     

解决方法

当您执行
a+b
时,通常会首先理解这意味着什么:
b.__radd__
仅在未实现
a.__add__
时才使用。因此,在一般情况下,如果要控制加法,则必须确保将对象放在第一位:
b+a
。 但是根据文档,这是一个例外。如果您将
numpy.ndarray
子类化,并定义了
__radd__
方法,则将首先尝试。因此,如果使您的对象基于数组有意义,则可以这样做。