当一个对象可以等于不同类型的对象时,如何定义__hash__?

时间:2013-12-30 01:35:54

标签: python hash

在Python doscumentation中,我们可以阅读__hash__函数:

  

唯一需要的属性是比较相等的对象   相同的哈希值。

我有一个对象,它可以等于同一类型的其他对象,或者字符串:

class MyClass:
    def __eq__(self, other):
        if isinstance(other, str):
            return self.x == other
        if isinstance(other, MyClass):
            return id(self) == id(other)
        return False

拥有此__eq__函数,如何定义有效的__hash__函数?

警告:此处MyClass()个对象是可变的,self.x可能会发生变化!

1 个答案:

答案 0 :(得分:2)

您无法定义一致的哈希。首先,您的班级不会始终定义__eq__;如果x == yy == z,则无法保证x == z。其次,你的对象是可变的。在Python中,可变对象不应该是可散列的。

  

如果一个类定义了可变对象并实现了__cmp__()__eq__()方法,那么它不应该实现__hash__(),因为hashable collection实现要求对象的hash值是不可变的(如果对象的哈希值更改,它将在错误的哈希桶中。)

损坏==

的示例
x = MyClass('foo')
y = 'foo'
z = MyClass('foo')

x == y # True
y == z # True
x == z # False