Denis Kreshikhin Denis Kreshikhin - 4 months ago 12
Python Question

How to make an object properly hashable?

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?

Answer

You also need to define __eq__() in a compatible way with __hash__() – otherwise, equality will be based on object identity.