簡體   English   中英

在類中重寫__eq__時,還需要重寫__hash__嗎?

[英]When you override __eq__ in a class, do you also need to override __hash__?

我正在Python 3中制作一個節點類,它將以最小順序的多樹結構存儲。 我覆蓋了__eq__方法,該方法通過比較兩個唯一的整數實例變量來測試是否相等。

  1. 這種方法是否可以通過比較相等性來查找結構中的節點?
  2. 我還需要覆蓋__hash__嗎?

是的,您必須重寫__hash__

一般規則是:如果兩個實例相等(寫成__eq__ ,即a==b為True),則它們必須具有相同的哈希值。 否則,各種各樣的事情都會發生。

另外,對我來說__eq__還不夠。 至少,您需要定義__lt__

我正在Python 3中制作一個節點類,它將以最小順序的多樹結構存儲

如果這是唯一的用途,並且它們僅在內部使用,則用戶代碼永遠不會出現Node ,並且您的代碼不會將它們存儲在dicts或set中,也不會調用任何起作用的函數,也許您可​​以逃脫而不覆蓋__hash__

但是這些限制非常嚴格,無法真正執行。 並且重寫__hash____eq__一致也沒有好處。 因此,您仍然應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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