Die naheliegende Lösung (nämlich einfach die Methoden wie gewohnt definieren) sollte einfach “out of the box” funktionieren. Tatsächlich geht das aber eleganter – das hat nicht direkt was mit Polymorphismus zu tun, sondern nur mit cleverer Kombination der Gedanken von Namespaces und dem Umstand, dass Funktionen in Python first-class (“auch nur Objekte” sind). Ihr hättet nämlich einfach schreiben können:

class BeepingToy(Toy):
  def beep(self):
    print "%s beeps"%self.name

  play = beep

Mit diesem Code wird play (als so genannte Klassenvariable) einfach ein weiterer Name im Namespace von BeepingToys, der ganz platt auf die Funktion verweist, auf die schon beep verwiesen hat.