我有 2 个带有
+
运算符重载的点类:
class Point2D:
x = 0
y = 0
def __add__(self, __other: "Point2D"):
return Point2D(self.x + __other.x, self.y + __other.y)
class Point3D(Point2D):
z = 0
def __add__(self, __other: "Point3D"):
return Point3D(self.x + __other.x, self.y + __other.y, self.z + __other.z)
我可以添加2个相同类型的点,但我也希望能够添加2个不同类型的点,例如:
>>> print(Point2D(1, 2) + Point3D(0, 1, 2))
(1, 3, 2)
我尝试使用预期的不同类型再次重载运算符(在 Point3D 类中):
def __add__(self, __other: "Point2D"):
return Point3D(self.x + __other.x, self.y + __other.y, self.z)
但它不会将它们识别为两个不同的函数,而只是选择最后一个(我的猜测是因为预期的类型参数只是 python 中的一个建议,实际上它只是一个对象,因此它具有相同的函数签名)。有没有办法在不诉诸函数内的
isinstance()
情况的情况下做到这一点?
当你谈到重载加法时,对我来说,交换律可能会丢失是有道理的(即
A+B
可以与 B+A
不同)
您写的
"I also want to be able to add 2 points of different types"
确实有效,只要(在当前情况下)Point3D
位于左侧。因为 A+B
使用 __add__
的 A
,而 B+A
使用 __add__
的 B
。
class Point2D:
x = 0
y = 0
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return(str(tuple([self.x, self.y])))
def __add__(self, __other: "Point2D"):
return Point2D(self.x + __other.x, self.y + __other.y)
class Point3D(Point2D):
z = 0
def __init__(self, x, y, z=0):
super().__init__(x, y)
self.z = z
def __str__(self):
return(str(tuple([self.x, self.y, self.z])))
def __add__(self, __other: "Point3D"):
return Point3D(self.x + __other.x, self.y + __other.y, self.z + __other.z)
def __add__(self, __other: "Point2D"):
return Point3D(self.x + __other.x, self.y + __other.y, self.z)
if __name__=="__main__":
print(Point2D(1,2) + Point3D(1,2,3))
print(Point3D(1,2,3) + Point2D(1,2))
确实会输出:
(2, 4)
(2, 4, 3)
这对我来说很有意义。这不是您要找的吗?