So verwenden Sie die __str__() und __repr__() Methoden in Python

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:

Output
mydate1 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:

Output
The 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