簡體   English   中英

對X和Y坐標的元組進行簡單的加法和減法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM