__str__ contre __repr__ en Python

Aditya Raj 30 janvier 2023
  1. La fonction str() en Python
  2. La méthode __str__() en Python
  3. La fonction repr() en Python
  4. La méthode __repr__() en Python
  5. __str__() vs __repr__() en Python
  6. Conclusion
__str__ contre __repr__ en Python

En Python, nous convertissons généralement n’importe quel objet en une chaîne en utilisant la fonction str(). De même, nous pouvons obtenir la représentation sous forme de chaîne d’un objet en utilisant la fonction repr(). Pour que str() et repr() produisent une sortie, l’objet qui est passé à ces fonctions doit avoir une implémentation de la méthode __str__() et de la méthode __repr__(), respectivement.

Souvent, les développeurs sont confus entre les fonctionnalités et les cas d’utilisation de ces méthodes. Dans le tutoriel, nous allons discuter du fonctionnement de la fonction str() et de la fonction repr() et de la façon dont la méthode __str__() et la méthode __repr__() affectent le comportement d’un objet.

La fonction str() en Python

La fonction str() permet d’obtenir la représentation sous forme de chaîne d’un objet. Il prend un objet comme argument d’entrée et renvoie sa représentation sous forme de chaîne. Par exemple, nous pouvons obtenir la représentation sous forme de chaîne d’un nombre à virgule flottante, comme illustré dans l’exemple suivant.

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

Production :

The number is: 123.456
The string is: 123.456

De même, nous pouvons convertir d’autres objets de types de données intégrés tels que des entiers, des listes, des ensembles, des tuples, etc. dans leurs représentations sous forme de chaîne respectives à l’aide de la fonction str(), comme indiqué ci-dessous.

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)

Production :

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}

Cependant, la sortie n’est pas compréhensible lorsque nous passons un objet défini à l’aide d’une définition de classe personnalisée. Pour s’en rendre compte, définissons une classe Student avec les attributs name et 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)

Production :

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

Ici, vous pouvez voir que la sortie de la fonction n’est pas aussi compréhensible qu’elle est apparue lorsque nous avons converti un objet défini à l’aide des structures de données intégrées. Pourquoi cela arrive-t-il?

Lorsque nous passons un objet à la fonction str(), la méthode __str__() définie dans la définition de classe est invoquée. La méthode __str__() renvoie la représentation sous forme de chaîne de l’objet. La fonction str() renvoie alors la même chaîne. Cependant, il n’y a pas de méthode __str__() lorsque nous définissons une classe personnalisée. De ce fait, la sortie de la fonction str() n’est pas très compréhensible.

La méthode __str__() en Python

Selon nos besoins, nous pouvons implémenter la méthode __str__() dans n’importe quelle définition de classe. La seule restriction ici est que la méthode doit renvoyer une valeur de chaîne. Par exemple, nous pouvons implémenter la méthode __str__() pour la classe Student, comme indiqué ci-dessous.

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

Après avoir implémenté la méthode __str__(), lorsque nous passons un objet Student à la fonction str(), celle-ci renvoie la même chaîne renvoyée par la méthode __str__(). L’exemple suivant montre comment cela fonctionne.

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)

Production :

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

Vous pouvez implémenter la méthode __str__() de n’importe quelle manière. Par exemple, nous pouvons définir la méthode __str__() de la classe Student d’une manière alternative, comme indiqué ci-dessous.

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)

Production :

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

La façon dont nous implémentons la méthode __str__() n’affecte pas l’exécution du programme. La sortie de la méthode __str__() est utilisée uniquement pour montrer la sortie à l’utilisateur.

La fonction repr() en Python

La fonction repr() est utilisée pour obtenir la représentation formelle sous forme de chaîne de n’importe quel objet. Il prend également un objet en entrée et renvoie la représentation sous forme de chaîne d’un objet, comme indiqué ci-dessous.

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)

Production :

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}

Vous pouvez observer que la sortie de la fonction repr() est presque identique à la sortie de la fonction str(). Cependant, le fonctionnement des deux méthodes est totalement différent. Lorsque nous passons un objet à la fonction str(), la méthode __str__() est invoquée. D’autre part, lorsque nous passons un objet à la fonction repr(), la méthode __repr__() est invoquée. L’exemple suivant montre comment cela fonctionne.

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)

Production :

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>

Nous avons défini ici la classe Student avec la méthode __str__(). Vous pouvez observer que les sorties sont différentes si nous passons une instance de la classe Student à la fonction str() et à la fonction repr().

La fonction str() renvoie la sortie renvoyée par la méthode __str__() tandis que la fonction repr() renvoie la sortie renvoyée par la méthode __repr__(). Si nous n’implémentons pas la méthode __str__(), la fonction str() renvoie également la sortie de la méthode __repr__().

La méthode __repr__() en Python

La méthode __repr__() renvoie la représentation canonique d’un objet en python. La méthode __repr__() est implémentée pour tous les objets en python, qu’ils soient des instances de classes intégrées ou personnalisées. Vous pouvez comprendre la définition de la méthode __repr__() pour les objets définis à l’aide de classes personnalisées comme suit.

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

Ici, self.__module désigne le module dans lequel l’objet courant est créé, type(self).__name__ désigne le nom de la classe, et hex(id(self)) désigne l’identité de l’objet au format hexadécimal. L’exemple suivant montre comment cela fonctionne.

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)

Production :

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

Ici, vous pouvez voir que la sortie de la méthode __repr__() est similaire au schéma défini dans la définition de la méthode. La sortie montre que l’objet a été défini dans le module __main__ et est de la classe Student. La sortie affiche également l’identité de l’objet.

Il faut toujours éviter de surcharger la méthode __repr__(). En effet, la méthode __repr__() est utilisée pour créer une représentation sous forme de chaîne canonique de l’objet, à l’aide de laquelle nous pouvons réinstancier le même objet.

Cependant, si nous redéfinissons la méthode __repr__(), nous ne pourrons pas créer l’objet à partir de sa représentation sous forme de chaîne à l’aide de la fonction eval().
Comme nous avons discuté des bases de la méthode __str__() et de la méthode __repr__(), énumérons quelques-unes des différences entre les deux méthodes.

__str__() vs __repr__() en Python

La méthode __str__() renvoie la forme de chaîne lisible par l’utilisateur d’un objet que le développeur peut personnaliser. Cependant, la méthode __repr__() renvoie une représentation sous forme de chaîne canonique de la chaîne. Dans certains cas, la chaîne retournée par la méthode __str__() peut être la même que la chaîne retournée par la méthode __repr__(). Vous pouvez observer cela dans le cas des nombres.

Cependant, lorsque l’on prend une chaîne ou un objet à l’aide d’une définition de classe personnalisée, la chaîne renvoyée par la méthode __repr__() est différente de la chaîne renvoyée par la méthode __str__(). L’exemple suivant montre comment cela fonctionne.

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)

Production :

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

Ici, vous pouvez observer que la chaîne retournée par la méthode __str__() est Aditya. D’autre part, la méthode __repr__() renvoie la représentation canonique de chaîne Aditya.

  • Lorsque l’on passe la chaîne retournée par la méthode __repr__() à la fonction eval(), elle retourne l’objet. En revanche, lorsque nous passons la chaîne renvoyée par la méthode __str__() à la fonction eval(), celle-ci peut ou non renvoyer l’objet python. Par exemple, regardez l’exemple suivant.
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)

Production :

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

Ici, vous pouvez observer que nous pouvons obtenir un objet entier à partir d’une représentation sous forme de chaîne de l’entier obtenu en utilisant la méthode __str__() et la méthode __repr__(). Maintenant, regardez l’exemple suivant.

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)

Production :

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

Vous pouvez voir que nous pouvons créer un objet chaîne à partir de la chaîne retournée par la méthode __repr__(). Cependant, lorsque nous essayons de créer l’objet chaîne en utilisant la chaîne renvoyée par la méthode __str__(), le programme rencontre l’exception NameError.

  • Vous pouvez surcharger la méthode __str__() et l’implémenter selon vos besoins. Cependant, vous ne devez pas surcharger la méthode __repr__().
  • La méthode __repr__() est principalement utilisée par les développeurs lors du débogage. D’autre part, la méthode __str__() est utilisée pour obtenir une représentation textuelle d’un objet que l’utilisateur peut comprendre.
  • La méthode __repr__() est invoquée pour produire la sortie lorsque l’on tape le nom de la variable ou l’objet dans la console python interactive. Par contre, la méthode __str__() est invoquée lorsque l’on passe la variable à la fonction print() ou à la fonction str().
  • Si la définition de classe ne contient pas la méthode __str__(), la méthode __repr__() est invoquée par l’interpréteur python lorsque l’on passe l’objet à la fonction str().
  • Lorsque nous passons un objet conteneur à la fonction print(), la méthode __repr__() des éléments de l’objet conteneur est imprimée, que nous ayons implémenté ou non la méthode __str__() dans la définition de classe des éléments ou non.

Conclusion

Dans cet article, nous avons abordé le fonctionnement de la fonction str(), de la méthode __str__(), de la fonction repr() et de la méthode __repr__(). Nous avons également discuté de la différence entre les utilisations de la méthode __str__() et de la méthode __repr__().

Bien que les sorties des deux méthodes soient similaires, il existe des différences distinctes qui rendent la méthode __repr__() et la méthode __str__() très différentes l’une de l’autre. Je vous suggère d’utiliser la méthode __repr__() pour obtenir la représentation sous forme de chaîne des objets dans les cas où vous devez ré-instancier l’objet à l’aide de la représentation sous forme de chaîne.

D’autre part, vous devez utiliser la méthode __str__() pour produire une représentation lisible par l’homme de l’objet qui n’a aucune utilité dans le programme à part informer l’utilisateur.

Auteur: 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

Article connexe - Python String