我已经学习了大约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
)作为积分答案 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__
方法完成的。