![](/img/trans.png)
[英]Converting tuples of (x,y) coordinates to a tuple of x and a tuple of y coordinates
[英]Simple addition and subtraction for tuples of X and Y coordinates
我已經學習了大約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
)作為點 以下是如何在名為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在GitHub Gist上的代碼可能會很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.