title: How to make an object properly hashable?
body: <p>Here is my code:</p>
  
  <pre><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?
  </code></pre>
  
  <p>Why is this happening?<br>
  The 1st and the 3rd object have same content and same hash but <code>len()</code> tells about 3 unique objects?</p>