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

时间:2015-01-05 15:42:33

标签: python

我已经学习了大约6个月的Python,虽然我有很多实际知识,但我仍然没有很少的经验编程知识(用Python或其他方式)。结果,我担心的是1.我正在重新发明轮子,而我自己解决问题的尝试将充满我不知道的问题。

问题

问题很简单。我有由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

这些类型的点是“完全相同”的动物,我只需要能够区分它们。

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

解决方案尝试

我尝试过使用collections.namedtuple

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

这很好,因为测试两种不同类型的点的相等性是微不足道的,而“转换”也是有效的:

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类来独立实现这种行为,这些类似乎 很难 - 但我觉得我要重新发明一个轮子肯定已经创造了数百万次。
  • 使用抽象基类并提供必要的方法 - 也许numbers.Complex
  • 使用numpy.matrix(或array)作为积分

1 个答案:

答案 0 :(得分:7)

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

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

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

如果你想了解如何实现一个更灵活的Point类,它可以处理超过2个维度,那么

Kevin's code on GitHub Gist会很有用。