通过__hash__实现__eq__?

时间:2016-11-01 14:37:00

标签: python python-3.x

阅读How to implement a good __hash__ function in python - 我不能将 eq 写为

def __eq__(self, other):
    return isinstance(other, self.__class__) and hash(other) == hash(self)

def __ne__(self, other):
    return not self.__eq__(other)

def __hash__(self):
    return hash((self.firstfield, self.secondfield, totuple(self.thirdfield)))

?当然,我也将实施__hash__(self)。我有相当明确的班级成员。我将把它们全部变成元组并从那些元组中产生一个完整的元组并散列出来。

2 个答案:

答案 0 :(得分:4)

一般来说,哈希函数会发生冲突。如果您根据哈希定义相等性,那么您将面临完全不同的项目比较相等的风险,因为它们最终使用相同的哈希码。避免这种情况的唯一方法是,如果你的类只有一小部分固定数量的可能实例,并且你以某种方式确保每一个都有一个不同的哈希值。如果你的类很简单,那么实用就足够了,那么你几乎可以简单地比较实例变量来直接确定相等性。您的__hash__()实现无论如何都必须检查所有实例变量,以便计算有意义的哈希值。

答案 1 :(得分:1)

当然,您可以以您的示例中的方式定义__eq____ne__,但除非您明确定义__hash__,否则您将获得每当您尝试比较该类型的两个对象之间的相等性时,TypeError: unhashable type异常。

由于您通过定义__eq__方法为对象定义了一些相似的,因此更重要的一个问题是您认为值是什么__hash__方法的内容,则无法评估__eq__方法的质量或有效性。