Was ist der Unterschied zwischen __str__(self) und __repr__(self)?
Hallo, ich befasse mich aktuell mit magic Methods in Python und bin gerade beim __str__ und __repr__. Soweit ich __str__(self) korrekt verstanden habe, ist es eine Methode, um den Verweis auf die Speicheradresse a la __main__... zu umgehen und stattdessen ein lesbares Ergebnis als String herauszugeben. Dazu habe ich auch einen eigenen Code geschrieben, der funktioniert.
Ich verstehe aber nicht, wo genau ich jetzt __str__(self) und wo __repr__(self) einsetze, denn bei __repr__(self) kommt das gleiche Ergebnis raus. Ist __repr__(self) im Programmieralltag überhaupt relevant? Ich habe gelesen, dass es fürs Debugging benutzt wird, darunter kann ich mir als Neueinsteiger aber (noch) nichts vorstellen.
1 Antwort
__str__ erzeugt einen String, der das Objekt beschreibt und z.B. für Ausgabezwecke genutzt werden kann. Ein für den Menschen gut lesbare Darstellung.
__repr__ erzeugt einen string, der das Object möglichst gut repräsentiert und darstellt, wie das Objekt wieder erzeugt werden kann.
Das ist grob der Unterschied, die Dokumentation erklärt das ausführlicher..
Wir können das aber mal an einem Beispiel darlegen. Nehmen wir an, Du machst eine Klasse Mensch mit Verschiedenen Attributen.
Dann könnte __str__() sowas wie 'Vorname: <first>, Name: <last>, ...' zurückliefern, wobei <first> der Wert des Attributes first sein soll.
Bei __repr__ würdest Du 'Mensch(<first>,<last>,....) ausgeben, sodaß ein eval() des Strings zur Reinstanziierung des Objektes führen würde.
Die Doku sagt zu __str__:
This method differs from object.__repr__() in that there is no expectation that __str__() return a valid Python expression: a more convenient or concise representation can be used.
Die Standardimplementierung von __str__ ruft __repr__ auf. Sobald also __repr__ vorhanden ist, liefet __str__ automatisch das gleiche, es sei denn, man legt für __str__ etwas anderes fest.
Vielen Dank, also habe ich quasi das gleiche Ergebnis bekommen, weil ich __str__ einfach nur durch __repr__ ersetzt habe, ohne sonstige Anpassungen vorzunehmen. War nur ein Test, was für eine Fehlermeldung ich kriege, aber das Ergebnis war ohne Fehlermeldung gleichbleibend, was mich verwundert hat.
Ich muss mir die Dokumentation dazu mal ansehen, die gibt es leider nicht auf Deutsch 😅 Danke schön!