这是我的代码:
class Hero:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name + str(self.age)
def __hash__(self):
print(hash(str(self)))
return hash(str(self))
heroes = set()
heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 1
heroes.add(Hero('Lara Miheenko', 17)) # gets hash -2822451113328084695
print(len(heroes)) # gets 2
heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 3! WHY?
为什么会发生这种情况?
第一个和第三个对象具有相同的内容和相同的哈希值,但是len()
讲述 3 个独特的物体?
您还需要定义__eq__()
以兼容的方式__hash__() http://docs.python.org/reference/datamodel.html#object.__hash__– 否则,平等将基于对象身份。
在 Python 2 上,建议您还定义__ne__
使!=
是一致的==
。在 Python 3 上,默认__ne__
实施将委托给__eq__
为你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)