python - Python 中的运算符重载 : handling different types and order of parameters

标签 python class operator-overloading operators

<分区>

我有一个简单的类,可以帮助对向量(即数字列表)进行数学运算。我的 Vector 可以乘以 Vector 的其他实例 标量(floatint).

在其他更强类型的语言中,我会创建一个方法来将两个 vector 相乘,并创建一个单独的方法来将 vectorint< 相乘/ float 。我对 Python 还是很陌生,不确定我将如何实现它。我能想到的唯一方法是覆盖 __mul__() 并测试传入参数:

class Vector(object):
  ...
 def __mul__(self, rhs):
  if isinstance(rhs, Vector):
     ...
  if isinstance(rhs, int) or isinstance(rhs, float):
    ...

即使我那样做,我也会被迫将 Vector 乘以这样的标量:

v = Vector([1,2,3])

result = v * 7

如果我想颠倒乘法中操作数的顺序怎么办?

result = 7 * v

在 Python 中执行此操作的正确方法是什么?

最佳答案

您还需要实现 __rmul__。当对 int.__mul__(7, v) 的初始调用失败时,Python 将接下来尝试 type(v).__rmul__(v, 7)

def __rmul__(self, lhs):
    return self * lhs  # Effectively, turn 7 * v into v * 7

正如 Rawing 指出的那样,您可以简单地为该定义编写 __rmul__ = __mul____rmul__ 的存在是为了允许非交换乘法,其中简单地推迟到 __mul__ 并反转操作数是不够的。

例如,如果您正在编写一个 Matrix 类并希望支持嵌套列表的乘法,例如,

m = Matrix(...)  # Some 2 x 2 matrix
n = [[1, 2], [3,4]]
p = n * m

在这里,list 类不知道如何将列表乘以 Matrix 实例,所以当 list.__mul__(n, m) 失败,Python 接下来会尝试 Matrix.__rmul__(m, n)。但是,n * mm * n 是两个一般的不同结果,所以 Matrix.__rmul__(m, n) != Matrix.__mul__(m, n); __rmul__ 必须做一些额外的工作才能生成正确的答案。

关于python - Python 中的运算符重载 : handling different types and order of parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44521074/

相关文章:

python - 访问并不总是存在于多个词典中的 key

java - 安卓/Java : How to import classes in a subpackage from another sub-package?

c++ - 为什么一元加号不跟在括号后面

C++ 运算符重载和继承

python - 根据条件获取数据帧行数

python - 由 Spring 连接的两个质量......尝试模拟飞行但遇到困难

python - 如何从另一个 kodi/xbmc 插件调用方法

c++ - 我在模板类中有多个 * 运算符的重载。为什么按不同的顺序放置声明会得到不同的结果?

c++ - 复制构造函数类

python - 一次重载多个运算符