How to make an object properly hashable?

python, python-3.x

Solution

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.

Problem

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?

Original source