X 和 Y 坐标元组的简单加减法

Simple addition and subtraction for tuples of X and Y coordinates

我已经学习 Python 大约 6 个月了,虽然我有很多事实知识,但我仍然很少有经验编程知识(在 Python 或其他方面)。因此,我担心 1. 我正在重新发明轮子和 2. 我尝试自己解决问题的尝试会充满我不知道的问题。

问题

问题很简单。我有由 X 和 Y 坐标组成的点。我希望能够简单地将它们加减在一起并测试是否相等:

a = Point(1,1)
b = Point(2,2)
assert a + a == b

另一个困难是我至少有两个不同的 种类 点,我需要能够在它们之间进行转换并测试它们之间的坐标是否相等:

r = RegularPoint(1,1)
i = InterfacePoint(1,1)
ri = RegularPoint(i)
assert ri == i

这些类型的点是 "exactly the same" 动物,我只需要能够区分它们。

一些更可能相关的信息:点的多个对象引用将保存在许多容器中,最多只有数万个。

解决方案尝试

我试过使用 collections.namedtuple

from collections import namedtuple as nt
PointA = nt('PointA','x y')
PointB = nt('PointB','x y')

这很好,因为测试两种不同类型的点是否相等是微不足道的,而且 "converting" 也适用:

a = PointA(1,1)
b = PointB(1,1)
assert a == b
aB = PointB(*a)
assert aB == a

但是我的测试代码会失败,因为将 tuple 加在一起的行为与预期结果不同:

assert a + a == (1, 1, 1, 1)

我怎样才能让这个按照我想要的方式工作?顺便说一句,我根本不喜欢这种方法,所以如果这是最好的事情,请告诉我完全放弃它。

我考虑过的其他选择

以下是如何在名为 Point 的新 class 中实现加法:

class Point(namedtuple('Point', ['x', 'y'])):
    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

您想要的不仅仅是 namedtuple,因为您要做的不仅仅是存储数据。所以我将其包装在一个名为 Point 的新 class 中。新的 class 需要通过 + 实现二进制加法,在 Python 中通过实现 __add__ 方法来完成。

Kevin's code on GitHub Gist 如果您想了解如何实现更灵活的 Point class 可以处理不止 2 个维度,

可能会有用。