__str__ vs __repr__ in Python

Aditya Raj 3 April 2022
  1. Die Funktion str() in Python
  2. Die __str__()-Methode in Python
  3. Die repr()-Funktion in Python
  4. Die __repr__()-Methode in Python
  5. __str__() vs __repr__() in Python
  6. Fazit
__str__ vs __repr__ in Python

In Python wandeln wir normalerweise jedes Objekt mit der Funktion str() in einen String um. Auf ähnliche Weise können wir die String-Darstellung eines Objekts mit der Funktion repr() erhalten. Damit str() und repr() eine Ausgabe erzeugen, muss das Objekt, das an diese Funktionen übergeben wird, eine Implementierung der Methode __str__() bzw. der Methode __repr__() haben.

Oft sind die Entwickler zwischen den Funktionalitäten und Anwendungsfällen dieser Methoden verwirrt. Im Tutorial werden wir besprechen, wie die Funktion str() und die Funktion repr() funktionieren und wie die Methode __str__() und die Methode __repr__() das Verhalten eines Objekts beeinflussen.

Die Funktion str() in Python

Die Funktion str() wird verwendet, um die Zeichenkettendarstellung eines Objekts zu erhalten. Es nimmt ein Objekt als Eingabeargument und gibt seine Zeichenkettendarstellung zurück. Beispielsweise können wir die Zeichenkettendarstellung einer Gleitkommazahl erhalten, wie im folgenden Beispiel gezeigt.

myNum = 123.456
myStr = str(myNum)
print("The number is:", myNum)
print("The string is:", myStr)

Ausgabe:

The number is: 123.456
The string is: 123.456

In ähnlicher Weise können wir andere Objekte mit integrierten Datentypen wie Ganzzahlen, Listen, Mengen, Tupel usw. mithilfe der Funktion str() wie unten gezeigt in ihre jeweiligen Zeichenkettendarstellungen konvertieren.

myNum = 123
myList = [1, 2, 3, 4, 5]
mySet = {1, 2, 3, 4, 5}
myStr1 = str(myNum)
myStr2 = str(myList)
myStr3 = str(mySet)

print("The number is:", myNum)
print("The string is:", myStr1)
print("The list is:", myList)
print("The string is:", myStr2)
print("The set is:", mySet)
print("The string is:", myStr3)

Ausgabe:

The number is: 123
The string is: 123
The list is: [1, 2, 3, 4, 5]
The string is: [1, 2, 3, 4, 5]
The set is: {1, 2, 3, 4, 5}
The string is: {1, 2, 3, 4, 5}

Die Ausgabe ist jedoch nicht verständlich, wenn wir ein Objekt übergeben, das mit einer benutzerdefinierten Klassendefinition definiert wurde. Um dies zu beobachten, definieren wir eine Klasse Student mit den Attributen name und age.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age


student1 = Student("Aditya", 23)
myStr = str(student1)
print("The string representation of student object is:")
print(myStr)

Ausgabe:

The string representation of student object is:
<__main__.Student object at 0x7f6016100070>

Hier können Sie sehen, dass die Ausgabe der Funktion nicht so verständlich ist, wie es aussah, als wir ein Objekt konvertierten, das mit den integrierten Datenstrukturen definiert wurde. Warum passiert das?

Wenn wir ein Objekt an die Funktion str() übergeben, wird die in der Klassendefinition definierte Methode __str__() aufgerufen. Die Methode __str__() gibt die Stringdarstellung des Objekts zurück. Die Funktion str() gibt dann denselben String zurück. Es gibt jedoch keine Methode __str__(), wenn wir eine benutzerdefinierte Klasse definieren. Aus diesem Grund ist die Ausgabe der Funktion str() nicht sehr verständlich.

Die __str__()-Methode in Python

Entsprechend unseren Anforderungen können wir die Methode __str__() in jeder Klassendefinition implementieren. Die einzige Einschränkung hier ist, dass die Methode einen Zeichenkettenwert zurückgeben muss. Beispielsweise können wir die Methode __str__() für die Klasse Student implementieren, wie unten gezeigt.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        myString = "Name: {} , Age: {}".format(self.name, self.age)
        return myString

Wenn wir nach der Implementierung der Methode __str__() ein beliebiges Student-Objekt an die Funktion str() übergeben, gibt es dieselbe Zeichenfolge zurück, die von der Methode __str__() zurückgegeben wird. Das folgende Beispiel zeigt, wie es funktioniert.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        myString = "Name: {} , Age: {}".format(self.name, self.age)
        return myString


student1 = Student("Aditya", 23)
myStr = str(student1)
print("The string representation of student object is:")
print(myStr)

Ausgabe:

The string representation of student object is:
Name: Aditya , Age: 23

Sie können die Methode __str__() beliebig implementieren. Zum Beispiel können wir die Methode __str__() der Klasse Student auf eine alternative Weise definieren, wie unten gezeigt.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        myString = "Name of student is: {} ,{} is {} years old".format(
            self.name, self.name, self.age
        )
        return myString


student1 = Student("Aditya", 23)
myStr = str(student1)
print("The string representation of student object is:")
print(myStr)

Ausgabe:

The string representation of student object is:
Name of student is: Aditya ,Aditya is 23 years old

Wie wir die Methode __str__() implementieren, hat keinen Einfluss auf die Ausführung des Programms. Die Ausgabe der Methode __str__() dient ausschließlich dazu, dem Benutzer die Ausgabe anzuzeigen.

Die repr()-Funktion in Python

Die Funktion repr() wird verwendet, um die formale Zeichenkettendarstellung eines beliebigen Objekts zu erhalten. Es nimmt auch ein Objekt als Eingabe und gibt die Zeichenkettendarstellung eines Objekts zurück, wie unten gezeigt.

myNum = 123
myList = [1, 2, 3, 4, 5]
mySet = {1, 2, 3, 4, 5}
myStr1 = repr(myNum)
myStr2 = repr(myList)
myStr3 = repr(mySet)

print("The number is:", myNum)
print("The string is:", myStr1)
print("The list is:", myList)
print("The string is:", myStr2)
print("The set is:", mySet)
print("The string is:", myStr3)

Ausgabe:

The number is: 123
The string is: 123
The list is: [1, 2, 3, 4, 5]
The string is: [1, 2, 3, 4, 5]
The set is: {1, 2, 3, 4, 5}
The string is: {1, 2, 3, 4, 5}

Sie können beobachten, dass die Ausgabe der Funktion repr() fast identisch mit der Ausgabe der Funktion str() ist. Die Funktionsweise beider Methoden ist jedoch völlig unterschiedlich. Wenn wir irgendein Objekt an die Funktion str() übergeben, wird die Methode __str__() aufgerufen. Wenn wir andererseits ein beliebiges Objekt an die Funktion repr() übergeben, wird die Methode __repr__() aufgerufen. Das folgende Beispiel zeigt, wie es funktioniert.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        myString = "Name of student is: {} ,{} is {} years old".format(
            self.name, self.name, self.age
        )
        return myString


student1 = Student("Aditya", 23)
myStr1 = str(student1)
myStr2 = repr(student1)
print("The string representation of student object is:")
print(myStr1)
print("The output of repr() is:")
print(myStr2)

Ausgabe:

The string representation of student object is:
Name of student is: Aditya ,Aditya is 23 years old
The output of repr() is:
<__main__.Student object at 0x7f6410b78070>

Wir haben hier die Klasse Student mit der Methode __str__() definiert. Sie können beobachten, dass die Ausgaben unterschiedlich sind, wenn wir eine Instanz der Klasse Student an die Funktion str() und die Funktion repr() übergeben.

Die Funktion str() gibt die von der Methode __str__() zurückgegebene Ausgabe zurück, während die Funktion repr() die von der Methode __repr__() zurückgegebene Ausgabe zurückgibt. Wenn wir die Methode __str__() nicht implementieren, gibt die Funktion str() auch die Ausgabe der Methode __repr__() zurück.

Die __repr__()-Methode in Python

Die Methode __repr__() gibt die kanonische Darstellung eines Objekts in Python zurück. Die Methode __repr__() wird für alle Objekte in Python implementiert, unabhängig davon, ob es sich um Instanzen von integrierten oder benutzerdefinierten Klassen handelt. Sie können die Definition der Methode __repr__() für Objekte, die mit benutzerdefinierten Klassen definiert wurden, wie folgt verstehen.

def __repr__(self):
    return "<{0}.{1} object at {2}>".format(
        self.__module__, type(self).__name__, hex(id(self))
    )

Dabei bezeichnet self.__module das Modul, in dem das aktuelle Objekt erstellt wird, type(self).__name__ bezeichnet den Namen der Klasse und hex(id(self)) bezeichnet die Identität des Objekts in Hexadezimalformat. Das folgende Beispiel zeigt, wie es funktioniert.

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        myString = "Name of student is: {} ,{} is {} years old".format(
            self.name, self.name, self.age
        )
        return myString


student1 = Student("Aditya", 23)
myStr = student1.__repr__()
print("The output of __repr__() is:")
print(myStr)

Ausgabe:

The output of __repr__() is:
<__main__.Student object at 0x7feb92cc8070>

Hier sehen Sie, dass die Ausgabe der Methode __repr__() dem in der Methodendefinition definierten Schema ähnelt. Die Ausgabe zeigt, dass das Objekt im Modul __main__ definiert wurde und der Klasse Student angehört. Die Ausgabe zeigt auch die Identität des Objekts.

Sie sollten es immer vermeiden, die Methode __repr__() zu überschreiben. Dies liegt daran, dass die Methode __repr__() verwendet wird, um eine kanonische Zeichenkettendarstellung des Objekts zu erstellen, mit deren Hilfe wir dasselbe Objekt erneut instanziieren können.

Wenn wir jedoch die Methode __repr__() überschreiben, können wir das Objekt nicht aus seiner Zeichenkettendarstellung mit der Funktion eval() erstellen.
Nachdem wir die Grundlagen der Methode __str__() und der Methode __repr__() besprochen haben, wollen wir einige der Unterschiede zwischen den beiden Methoden auflisten.

__str__() vs __repr__() in Python

Die Methode __str__() gibt die benutzerlesbare Zeichenkettenform eines Objekts zurück, das der Entwickler anpassen kann. Die Methode __repr__() gibt jedoch eine kanonische Zeichenkettendarstellung der Zeichenfolge zurück. In einigen Fällen kann die von der Methode __str__() zurückgegebene Zeichenfolge mit der von der Methode __repr__() zurückgegebenen Zeichenfolge identisch sein. Das kann man bei Zahlen beobachten.

Wenn wir jedoch eine Zeichenfolge oder ein Objekt mit einer benutzerdefinierten Klassendefinition verwenden, unterscheidet sich die von der Methode __repr__() zurückgegebene Zeichenfolge von der Zeichenfolge, die von der Methode __str__() zurückgegeben wird. Das folgende Beispiel zeigt, wie es funktioniert.

myStr = "Aditya"
myStr1 = myStr.__repr__()
myStr2 = myStr.__str__()
print("The string is:", myStr)
print("The output from the __repr__() method is:", myStr1)
print("The output from the __str__() method is:", myStr2)

Ausgabe:

The string is: Aditya
The output from the __repr__() method is: 'Aditya'
The output from the __str__() method is: Aditya

Hier können Sie beobachten, dass die von der Methode __str__() zurückgegebene Zeichenfolge Aditya ist. Andererseits gibt die Methode __repr__() die kanonische String-Darstellung 'Aditya' zurück.

  • Wenn wir den von der Methode __repr__() zurückgegebenen String an die Funktion eval() übergeben, gibt sie das Objekt zurück. Wenn wir andererseits die von der Methode __str__() zurückgegebene Zeichenfolge an die Funktion eval() übergeben, kann sie das Python-Objekt zurückgeben oder nicht. Sehen Sie sich zum Beispiel das folgende Beispiel an.
myNum = 1234
myNum1 = myNum.__repr__()
myNum2 = myNum.__str__()
print("The number is:", myNum)
print("The output from the __repr__() method is:", myNum1)
print("The output from the __str__() method is:", myNum2)
output1 = eval(myNum1)
print(output1)
output2 = eval(myNum2)
print(output2)

Ausgabe:

The number is: 1234
The output from the __repr__() method is: 1234
The output from the __str__() method is: 1234
1234
1234

Hier können Sie beobachten, dass wir ein ganzzahliges Objekt aus einer Zeichenkettendarstellung der Ganzzahl erhalten können, die mit der Methode __str__() und der Methode __repr__() erhalten wird. Sehen Sie sich nun das folgende Beispiel an.

myStr = "Aditya"
myStr1 = myStr.__repr__()
myStr2 = myStr.__str__()
print("The string is:", myStr)
print("The output from the __repr__() method is:", myStr1)
print("The output from the __str__() method is:", myStr2)
output1 = eval(myStr1)
print(output1)
output2 = eval(myStr2)
print(output2)

Ausgabe:

The string is: Aditya
The output from the __repr__() method is: 'Aditya'
The output from the __str__() method is: Aditya
Aditya
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (3.0.4) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 9, in <module>
    output2 = eval(myStr2)
  File "<string>", line 1, in <module>
NameError: name 'Aditya' is not defined

Sie können sehen, dass wir ein String-Objekt aus dem von der Methode __repr__() zurückgegebenen String erstellen können. Wenn wir jedoch versuchen, das String-Objekt mit dem von der Methode __str__() zurückgegebenen String zu erstellen, läuft das Programm in die Ausnahme NameError.

  • Sie können die Methode __str__() überschreiben und nach Bedarf implementieren. Sie sollten die Methode __repr__() jedoch nicht überschreiben.
  • Die Methode __repr__() wird hauptsächlich von Entwicklern beim Debuggen verwendet. Andererseits wird die Methode __str__() verwendet, um eine Textdarstellung eines Objekts zu erhalten, die der Benutzer verstehen kann.
  • Die Methode __repr__() wird aufgerufen, um die Ausgabe zu erzeugen, wenn wir den Namen der Variablen oder das Objekt in die interaktive Python-Konsole eingeben. Andererseits wird die Methode __str__() aufgerufen, wenn wir die Variable an die Funktion print() oder die Funktion str() übergeben.
  • Wenn die Klassendefinition die Methode __str__() nicht enthält, wird die Methode __repr__() vom Python-Interpreter aufgerufen, wenn wir das Objekt an die Funktion str() übergeben.
  • Wenn wir ein Containerobjekt an die Funktion print() übergeben, wird die Methode __repr__() der Elemente des Containerobjekts gedruckt, unabhängig davon, ob wir die Methode __str__() in der Klassendefinition implementiert haben der Elemente oder nicht.

Fazit

In diesem Artikel haben wir die Funktionsweise der Funktion str(), der Methode __str__(), der Funktion repr() und der Methode __repr__() besprochen. Wir haben auch den Unterschied zwischen der Verwendung der Methode __str__() und der Methode __repr__() besprochen.

Obwohl die Ausgaben beider Methoden ähnlich sind, gibt es deutliche Unterschiede, die die Methode __repr__() und die Methode __str__() stark voneinander unterscheiden. Ich schlage vor, dass Sie die Methode __repr__() verwenden, um die Zeichenkettendarstellung der Objekte in den Fällen zu erhalten, in denen Sie das Objekt mithilfe der Zeichenkettendarstellung erneut instanziieren müssen.

Andererseits sollten Sie die Methode __str__() verwenden, um eine für Menschen lesbare Darstellung des Objekts zu erzeugen, die im Programm keinen Nutzen hat, abgesehen davon, dass sie den Benutzer informiert.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

Verwandter Artikel - Python String