Here is my code:
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?
Why is this happening?
The 1st and the 3rd object have same content and same hash but len() tells about 3 unique objects?
You also need to define
__eq__()in a compatible way with__hash__()– otherwise, equality will be based on object identity.On Python 2, it is recommended you also define
__ne__to make!=consistent with==. On Python 3, the default__ne__implementation will delegate to__eq__for you.