gpt4 book ai didi

python - 我怎样才能重载运算符,这样左边/右边的类型就无关紧要了?

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:40 25 4
gpt4 key购买 nike

一个简单的例子——我想要一个点类来描述一个二维点。我希望能够将两个点相加......以及将两个点相乘(不要问我为什么),或者将一个点乘以一个标量。目前,我只会将其实现为标量是整数,但分数或 float 也很容易实现。

class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y

def __str__(self):
return "({0},{1})".format(self.x, self.y)

def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Point(x, y)

def __mul__(self, other):
if isinstance(other, Point):
x = self.x * other.x
y = self.y * other.y
return Point(x, y)
elif isinstance(other, int):
x = self.x * other
y = self.y * other
return Point(x, y)

所以,这在我执行时有效:

>>> p1 = Point(2, 3)
>>> p2 = Point(-1, 2)
>>> print(p1*p2)
(-2,6)
>>>print(p1*4)
(8,12)

但是当我颠倒标量和点对象的顺序时它不起作用:

>>>print(4*p1)
Traceback (most recent call last):
File "<input>", line 1, in <module> TypeError: unsupported operand type(s) for *:
'int' and 'Point'

我如何编写代码,无论我写“4 * p1”还是“p1 * 4”,我仍然会执行相同的代码并返回相同的答案?我是通过为 int 对象重载 mul 运算符来实现这一点,还是有其他方法?

注意:我的简短示例的代码是从 https://www.programiz.com/python-programming/operator-overloading 借来的

最佳答案

(我正要提交问题,我正在标记,并找到了答案。我认为值得在这里记录下来,以便其他人可以轻松找到它。)

定义 __rmul__(self, other)。这代表右乘。当左边的对象乘法失败时(在上面的例子中,整数不知道如何乘以右边的 Point 类)Python 会查看右边的对象,看看 __rmul__(self, other) 定义了特殊方法,它是否有效?如果是,它将改用此实现。

对于可交换的类(即,您可以将 AB 或 BA 相乘并获得相同的结果),您可以将其定义为:

def __mul__(self, other):
if isinstance(other, Point):
x = self.x * other.x
y = self.y * other.y
return Point(x, y)
elif isinstance(other, int):
x = self.x * other
y = self.y * other
return Point(x, y)

def __rmul__(self, other):
return self.__mul__(other)

关于python - 我怎样才能重载运算符,这样左边/右边的类型就无关紧要了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48218169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com