在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
可能会发生变化!
答案 0 :(得分:2)
您无法定义一致的哈希。首先,您的班级不会始终定义__eq__
;如果x == y
和y == 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