如何让__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
的每个元素,并对它们执行 p.__radd__
。换句话说,它决定返回的类型会是一个 ndarray
(只要代码没有崩溃)。我明白这是numpy在试图聪明地处理事情,但有时候我希望我的类来处理这些数学运算。
有没有办法让numpy数组表现得像标准的 __radd__
一样?
1 个回答
2
当你写 a+b
时,通常是先看 a
是怎么定义这个加法的:只有在 a
没有定义加法的时候,才会使用 b.__radd__
。所以一般来说,如果你想控制加法的行为,就得确保你的对象放在前面,比如写成 b+a
。
不过,按照文档的说法,这里有个例外。如果你创建了一个 numpy.ndarray
的子类,并且定义了一个 __radd__
方法,那么这个方法会优先被尝试。所以,如果你的对象是基于数组的,这样做是合理的。