问题描述
||
考虑以下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__
方法,则将首先尝试。因此,如果使您的对象基于数组有意义,则可以这样做。