提问人:Cole Bisaccia 提问时间:7/6/2019 最后编辑:shx2Cole Bisaccia 更新时间:7/6/2019 访问量:414
当您在类中覆盖__eq__时,是否还需要覆盖__hash__?
When you override __eq__ in a class, do you also need to override __hash__?
问:
我正在 Python 3 中创建一个节点类,我将将其存储在最小有序多树结构中。我覆盖了通过比较两个唯一的整数实例变量来测试相等性的方法。__eq__
- 这种方法是否适用于通过比较相等性来查找结构中的节点?
- 我还需要覆盖吗?
__hash__
答:
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__
评论