syntor hat geschrieben:Jedes benutzerdefinierte Objekt hat eine __hash__ Methode, sie gibt standardmässig id(self) zurück. Das sich daraus ergebende Verhalten ist vollkommen intuitiv, finde ich.
Nein, ist es nicht und deswegen wurde dies in Python 3.x geändert, so dass __hash__ nicht mehr vererbt wird wenn Vergleichsoperationen implementiert werden (oder zumindest __eq__).
Das Problem ist einfach dass man nicht erwartet dass veränderbare Objekte hashable sind, sollten sie es doch sein muss in logischer Konsequenz sich der Hash verändern wenn ich das Objekt selbst verändert. Ein solches Verhalten haben die built-in Sachen allerdings nicht.
Immer wenn man Vergleichsoperatoren implementiert sollte man dementsprechend __hash__ auf None setzen es sei den das Objekt ist unveränderbar, dann sollte man __hash__ implementieren, dass geht am einfachsten über den hash eines tuples der Attribute(siehe BlackJacks Beispiel) oder wie in der Dokumentation beschrieben.