Einführung
In diesem Artikel erfahren Sie mehr über die speziellen Methoden __str__()
und __repr__()
, die im Python-Datenmodell definiert sind. Die Methoden __str__()
und __repr__()
können beim Debuggen von Python-Code helfen, indem sie nützliche Informationen über ein Objekt protokollieren oder ausgeben.
Python-Sondermethoden beginnen und enden mit einem doppelten Unterstrich und werden informell als Dunder-Methoden bezeichnet. Dunder-Methoden sind die zugrunde liegenden Methoden für die in Python eingebauten Operatoren und Funktionen. Sie sollten vermeiden, Dunder-Methoden direkt aufzurufen, und stattdessen die Dunder-Methoden in Ihrer Klasse implementieren und dann die eingebauten Funktionen verwenden, die sie aufrufen, wie z.B. str()
und repr()
.
Was ist der Unterschied zwischen __str__()
und __repr__()
?
Die Methode __str__()
gibt eine für Menschen lesbare oder informelle Zeichenfolgenrepräsentation eines Objekts zurück. Diese Methode wird von den integrierten Funktionen print()
, str()
und format()
aufgerufen. Wenn Sie keine __str__()
-Methode für eine Klasse definieren, ruft die integrierte Objektimplementierung stattdessen die __repr__()
-Methode auf.
Die Methode __repr__()
gibt eine umfangreichere oder offizielle Zeichenfolgenrepräsentation eines Objekts zurück. Diese Methode wird von der integrierten Funktion repr()
aufgerufen. Wenn möglich, sollte die zurückgegebene Zeichenfolge ein gültiger Python-Ausdruck sein, der verwendet werden kann, um das Objekt neu zu erstellen. In allen Fällen sollte die Zeichenfolge informativ und eindeutig sein.
Im Allgemeinen ist die Zeichenfolge von __str__()
für Benutzer und die von __repr__()
für Entwickler gedacht.
__str__()
– und __repr__()
-Beispiele unter Verwendung einer integrierten Klasse
Die Beispiele in diesem Abschnitt rufen die __str__()
– und __repr__()
-Methoden direkt zu Demonstrationszwecken auf.
Die Klasse datetime.datetime
ist eine eingebaute Python-Klasse, die eine Standardimplementierung der __str__()
– und __repr__()
-Methoden hat.
Das folgende Beispielcode zeigt die Zeichenfolgen, die von der Standardimplementierung der Methoden `__str__()` und `__repr__()` für ein `datetime.datetime`-Objekt zurückgegeben werden:
import datetime
mydate = datetime.datetime.now()
print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))
print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))
Die Ausgabe ist:
Output__str__() string: 2023-01-27 09:50:37.429078
str() string: 2023-01-27 09:50:37.429078
__repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
Die Ausgabe zeigt, dass die Funktion `str()` `__str__()` aufruft und eine benutzerfreundliche Zeichenfolge zurückgibt, während die Funktion `repr()` `__repr__()` aufruft und eine detailliertere Zeichenfolge zurückgibt, die verwendet werden kann, um das Objekt wiederherzustellen. Tatsächlich können Sie die Funktion `repr()` zusammen mit der Funktion `eval()` verwenden, um ein neues Objekt aus der Zeichenfolge zu erstellen:
import datetime
mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))
print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))
print("the values of the objects are equal: ", mydate1==mydate2)
Die Ausgabe ist:
Outputmydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
the values of the objects are equal: True
Der vorherige Beispielcode erstellt das `mydate2`-Objekt aus der `repr()`-Zeichenfolge für `mydate1` und überprüft dann, ob die Werte beider Objekte gleich sind.
Beispiele für `__str__()` und `__repr__()` unter Verwendung einer neuen Klasse
Wenn Sie eine Klasse erstellen, sollten Sie mindestens die Methode `__repr__()` implementieren, damit nützliche Informationen zurückgegeben werden, wenn eingebaute Funktionen `__repr__()` verwenden.
Die folgende Klasse implementiert nicht die Methoden `__str__()` oder `__repr__()`:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
Die Ausgabe bei Verwendung von `str()` und `repr()` lautet:
Output<__main__.Ocean object at 0x102892860>
<__main__.Ocean object at 0x102892860>
Das vorherige Beispiel zeigt, dass die Standardimplementierung von `__repr()__` für das Objekt einen String zurückgibt, der nur die Klasse und die Objekt-ID im hexadezimalen Format enthält, was nicht sehr nützlich ist. Beachten Sie, dass `str()` und `repr()` denselben Wert zurückgeben, weil `str()` `__repr__()` aufruft, wenn `__str__()` nicht implementiert ist.
Aktualisieren Sie die Ocean-Klasse mit Implementierungen der Methoden `__str__()` und `__repr__()`:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
def __str__(self):
return f'The creature type is {self.name} and the age is {self.age}'
def __repr__(self):
return f'Ocean(\'{self.name}\', {self.age})'
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
Die Ausgabe ist:
OutputThe creature type is Jellyfish and the age is 5
Ocean('Jellyfish', 5)
Die Implementierung von `__str__()` im vorherigen Beispiel gibt einen leicht lesbaren String zurück, der die relevanten Details des Objekts für einen Benutzer liefert. Die Implementierung von `__repr__()` gibt einen String zurück, der ein gültiger Python-Ausdruck ist, mit dem das Objekt neu erstellt werden könnte: `Ocean(‚Jellyfish‘, 5)`. Das Beispiel verwendet f-String-Formatierung für die Strings, aber Sie können die Strings mit jedem von Python unterstützten Format formatieren.
Schlussfolgerung
In diesem Artikel haben Sie die Unterschiede zwischen den Methoden __str__()
und __repr__()
erforscht und diese speziellen Methoden in einer Klasse implementiert, sodass Sie sie nicht direkt aufrufen mussten. Erfahren Sie mehr über die Arbeit mit Zeichenketten in Python durch unsere Python-Zeichenketten-Tutorials.
Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions