Python中的运算符重载:处理不同类型和顺序的参数[重复]

2024-01-01

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

在其他更强类型的语言中,我将创建一种方法来将两个相乘vectors 和一个单独的方法来乘以 avector by and int/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 * m and m * n一般来说是两个不同的结果,所以Matrix.__rmul__(m, n) != Matrix.__mul__(m, n); __rmul__必须做一些额外的工作才能生成正确的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中的运算符重载:处理不同类型和顺序的参数[重复] 的相关文章

随机推荐