如何让__radd__与numpy数组一起工作

5 投票
1 回答
952 浏览
提问于 2025-04-16 18:19

考虑以下的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 的每个元素,并对它们执行 p.__radd__。换句话说,它决定返回的类型会是一个 ndarray(只要代码没有崩溃)。我明白这是numpy在试图聪明地处理事情,但有时候我希望我的类来处理这些数学运算。

有没有办法让numpy数组表现得像标准的 __radd__ 一样?

1 个回答

2

当你写 a+b 时,通常是先看 a 是怎么定义这个加法的:只有在 a 没有定义加法的时候,才会使用 b.__radd__。所以一般来说,如果你想控制加法的行为,就得确保你的对象放在前面,比如写成 b+a

不过,按照文档的说法,这里有个例外。如果你创建了一个 numpy.ndarray 的子类,并且定义了一个 __radd__ 方法,那么这个方法会优先被尝试。所以,如果你的对象是基于数组的,这样做是合理的。

撰写回答