Ich habe Probleme herauszufinden, warum die erste dieser Behauptungen in Ordnung ist und die zweite einen Fehler verursacht.
%Vor%Hier ist der Fehler:
%Vor% Der Test auf Gleichheit in der Subject-Klasse ist einfach self.name == other.name
, und in einem anderen UnitTest verifiziere ich das Subject("A") == Subject("A")
. Ich kann wirklich nicht herausfinden, warum das Thema in der Liste und nicht im Set ist. Idealerweise hätte ich gerne das Thema in beiden.
Der Ausdruck
%Vor% vergleicht Subject("A")
mit jedem Eintrag in subject_list
mit der Methode Subject.__eq__()
. Wenn diese Methode nicht überschrieben wird, gibt sie standardmäßig immer False
zurück, es sei denn, die beiden Operanden sind das gleiche Objekt . Der obige Ausdruck würde immer False
zurückgeben, wenn Subject
keine __eq__()
-Methode hat, da Subject("A")
eine neue Instanz ist, die nicht schon in der Liste sein kann.
Der Ausdruck
%Vor% dagegen wird Subject.__hash__()
zuerst verwenden, um den richtigen Bucket zu finden, und erst anschließend Subject.__eq__()
. Wenn Sie Subject.__hash__()
nicht auf eine Weise definiert haben, die mit Subject.__eq__()
kompatibel ist, schlägt dies fehl.
Die Mitgliedschaft in einer Gruppe hängt auch vom Hash des Objekts ab. Daher müssen Sie die Methode __hash__()
für die Klasse entsprechend implementieren.
Entweder haben Sie keine __hash__()
-Methode in Ihrer Subject
-Klasse oder sie ist zweideutig. Versuchen Sie Folgendes:
Die Dokumente sind hier .
Um diese in einem Set zu verwenden, müssen Sie sicherstellen, dass Subject
ordnungsgemäß hashbar ist. Wenn Sie __hash__
nicht selbst definieren, wird einfach die id
verwendet, und das ist für verschiedene Instanzen unterschiedlich. __hash__
sollte so definiert werden, dass gleiche Objekte gleiche Hashes haben.