Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Meine Python-Bücher (zB Python in a Nutshell) halten die Funktionsweise von == offenbar für so trivial, dass sie sich nicht bemühen, sie näher zu definieren oder zu erklären. Gibt es in Python zwei Klassenobjekte, die beim Vergleich mit == "True" ausgeben?
In [2]: class Liste(object):
def __init__(self, x):
self.liste = [x]
def __eq__(self, other_list):
return self.liste == other_list.liste
In [6]: liste_5 = Liste(31415926535)
In [7]: liste_6 = Liste(31415926535)
In [8]: liste_5 == liste_6
Out[8]: True
Edit: @Barabbas: Nein du verstehst da was falsch. Der Gleichheitsoperator überprüft die Werte der übergebenen Objekte. Was du meinst ist `is', der auf Identität prüft.
erzeugst Du doch zwei eigenständige, voneinander unabhängige Objekte.
Willst du dies miteinander vergleichen, so musst Du eine
'__eq__' Methode implementieren:
Ich hatte erwartet, dass die Magiemethode __eq__ eine Default-Implementierung hat, was offenbar nicht so ist. Aber wieso gibt es keine Fehlermeldung, wenn ich eine nicht implementierte Methode aufrufe? Oder gilt vielleicht folgendes Default:
Wuerde ich nicht machen, bei eigenen Klassen gibt es sicher bessere Kriterien wann sie gleich sind. Z.B. der Vor- und Nachname bei der Klasse Person oder andere Members (bei dir self.liste).
Goswin hat geschrieben:
Ich hatte erwartet, dass die Magiemethode __eq__ eine Default-Implementierung hat, was offenbar nicht so ist. Aber wieso gibt es keine Fehlermeldung, wenn ich eine nicht implementierte Methode aufrufe? Oder gilt vielleicht folgendes Default:
Habe grad in meinem 'Python kurz & gut' nachgeschaut:
__eq__ gehört zu den Rich-Comparison-Methoden,
ist es nicht definiert, wird auf __cmp__ zurückgegriffen,
ist auch dies nicht definiert, so werden die Instanzen
anhand ihrer Identität verglichen.
Goswin hat geschrieben:
Ich hatte erwartet, dass die Magiemethode __eq__ eine Default-Implementierung hat, was offenbar nicht so ist. Aber wieso gibt es keine Fehlermeldung, wenn ich eine nicht implementierte Methode aufrufe? Oder gilt vielleicht folgendes Default: