gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:19:44 26 4
gpt4 key购买 nike

我已经学习 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

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

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

解决方案尝试

我试过使用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)

最佳答案

下面是如何在名为 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__ 方法来完成的。

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

关于python - X 和 Y 坐标元组的简单加减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27782867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com