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
classes 独立实现行为,这似乎 too很难 - 但我觉得我会重新发明一个肯定已经被创造了数百万次的轮子。
- 使用抽象基础 class 并仅提供必要的方法 - 也许
numbers.Complex
- 使用
numpy.matrix
(或array
)作为积分
以下是如何在名为 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 个维度,
可能会有用。
我已经学习 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
classes 独立实现行为,这似乎 too很难 - 但我觉得我会重新发明一个肯定已经被创造了数百万次的轮子。 - 使用抽象基础 class 并仅提供必要的方法 - 也许
numbers.Complex
- 使用
numpy.matrix
(或array
)作为积分
以下是如何在名为 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 个维度,
可能会有用。