在类中重写__eq__时,还需要重写__hash__吗?

时间:2019-07-06 07:21:11

标签: python-3.x hash overriding equality

我正在Python 3中制作一个节点类,它将以最小顺序的多树结构存储。我覆盖了__eq__方法,该方法通过比较两个唯一的整数实例变量来测试是否相等。

  1. 这种方法是否可以通过比较相等性来在结构中查找节点?
  2. 我还需要覆盖__hash__吗?

2 个答案:

答案 0 :(得分:3)

是的,您必须覆盖__hash__

一般规则是:如果两个实例相等(写为__eq__,即a==b为True),则它们必须具有相同的哈希值。否则,各种各样的事情都可能发生错误行为。

此外,对我来说__eq__不足以达到最低要求。至少,您需要定义__lt__

答案 1 :(得分:1)

  

我正在用Python 3制作一个节点类,它将以最小顺序的多树结构存储

如果这是唯一的用法,并且仅在内部使用,那么用户代码永远不会出现Node,并且您的代码不会将它们存储在字典或集合中,也不会调用任何这样做,也许您可​​以不覆盖__hash__而逃脱。

但是这些限制非常严格,无法真正执行。而且,覆盖__hash____eq__保持一致没有任何好处。所以您仍然应该这样做。