在Python中,你的类的
这个问题出现在我编写某种类型的线性算子类时,我希望它能够使用乘法语法来乘以numpy数组。以下是说明该问题的最小示例:
但是右乘默认使用
在这种情况下,我该如何使它调用我的类的
欢迎回答特定于numpy数组的情况,但我也对覆盖无法修改的第三方类的方法的一般想法感兴趣。
__rmul__
方法是否可以覆盖另一个类的__mul__
方法,而不对另一个类进行更改?这个问题出现在我编写某种类型的线性算子类时,我希望它能够使用乘法语法来乘以numpy数组。以下是说明该问题的最小示例:
import numpy as np
class AbstractMatrix(object):
def __init__(self):
self.data = np.array([[1, 2],[3, 4]])
def __mul__(self, other):
return np.dot(self.data, other)
def __rmul__(self, other):
return np.dot(other, self.data)
左乘运算很好用:
In[11]: A = AbstractMatrix()
In[12]: B = np.array([[4, 5],[6, 7]])
In[13]: A*B
Out[13]:
array([[16, 19],
[36, 43]])
但是右乘默认使用
np.ndarray
的版本,它将数组拆分并逐个元素执行乘法(这不是预期的结果):In[14]: B*A
Out[14]:
array([[array([[ 4, 8],
[12, 16]]),
array([[ 5, 10],
[15, 20]])],
[array([[ 6, 12],
[18, 24]]),
array([[ 7, 14],
[21, 28]])]], dtype=object)
在这种情况下,我该如何使它调用我的类的
__rmul__
方法,以作用于原始(未拆分)数组?欢迎回答特定于numpy数组的情况,但我也对覆盖无法修改的第三方类的方法的一般想法感兴趣。
@
运算符? - Francisco