当您在类中覆盖__eq__时,是否还需要覆盖__hash__?

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

提问人:Cole Bisaccia 提问时间:7/6/2019 最后编辑:shx2Cole Bisaccia 更新时间:7/6/2019 访问量:414

问:

我正在 Python 3 中创建一个节点类,我将将其存储在最小有序多树结构中。我覆盖了通过比较两个唯一的整数实例变量来测试相等性的方法。__eq__

  1. 这种方法是否适用于通过比较相等性来查找结构中的节点?
  2. 我还需要覆盖吗?__hash__
python-3.x 哈希 覆盖 相等性

评论


答:

3赞 shx2 7/6/2019 #1

是的,您必须覆盖__hash__

一般规则是:如果两个实例相等(wrt 到 ,即 是 True),则它们必须具有相同的哈希值。否则,各种事情都可能行为不端。__eq__a==b

另外,在我看来,这听起来还不够。至少,您需要定义 .__eq____lt__

1赞 Alexey Romanov 7/6/2019 #2

我正在 Python 3 中创建一个节点类,我将将其存储在最小有序多树结构中

如果这是唯一的用途,并且它们仅在内部使用,因此用户代码不应该看到 ,并且您的代码不会将它们存储在字典或集合中,或者调用任何函数,也许您可以在不覆盖的情况下逃脱。Node__hash__

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