Python 中的多个运算符重载

问题描述 投票:0回答:1

我有 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()
情况的情况下做到这一点?

python operator-overloading
1个回答
0
投票

当你谈到重载加法时,对我来说,交换律可能会丢失是有道理的(即

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)

这对我来说很有意义。这不是您要找的吗?

© www.soinside.com 2019 - 2024. All rights reserved.