Comment utiliser les méthodes __str__() et __repr__() en Python
Introduction
Dans cet article, vous apprendrez les méthodes spéciales __str__() et __repr__() qui sont définies dans le modèle de données Python. Les méthodes __str__() et __repr__() peuvent être utiles pour déboguer du code Python en enregistrant ou en imprimant des informations utiles sur un objet.
Les méthodes spéciales de Python commencent et se terminent par un double underscore et sont appelées informellement méthodes dunder. Les méthodes dunder sont les méthodes sous-jacentes pour les opérateurs et fonctions intégrés de Python. Vous devez éviter d'appeler les méthodes dunder directement, et plutôt implémenter les méthodes dunder dans votre classe, puis utiliser les fonctions intégrées qui les appellent, telles que str() et repr().
Quelle est la différence entre __str__() et __repr__()?
La méthode __str__() renvoie une représentation sous forme de chaîne de caractères lisible par un humain, ou informelle, d'un objet. Cette méthode est appelée par les fonctions intégrées print(), str() et format(). Si vous ne définissez pas de méthode __str__() pour une classe, alors l'implémentation d'objet intégrée appelle la méthode __repr__() à la place.
La méthode __repr__() retourne une représentation de chaîne d'un objet plus riche en informations, ou officielle. Cette méthode est appelée par la fonction intégrée repr(). Si possible, la chaîne retournée doit être une expression Python valide qui peut être utilisée pour recréer l'objet. Dans tous les cas, la chaîne doit être informative et sans ambiguïté.
En général, la chaîne __str__() est destinée aux utilisateurs et la chaîne __repr__() est destinée aux développeurs.
__str__() et __repr__() Exemples utilisant une classe intégrée
Les exemples de cette section appellent directement les méthodes __str__() et __repr__() à des fins de démonstration.
La classe datetime.datetime est une classe intégrée de Python qui a une implémentation par défaut des méthodes __str__() et __repr__().
Le code d'exemple suivant montre les chaînes retournées par l'implémentation par défaut des méthodes __str__() et __repr__() pour un objet datetime.datetime:
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))
La sortie est :
__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)
La sortie montre que la fonction str() appelle __str__() et renvoie une chaîne compréhensible par l'homme, tandis que la fonction repr() appelle __repr__() et renvoie une chaîne plus riche en informations qui peut être utilisée pour recréer l'objet. En fait, vous pouvez utiliser la fonction repr() avec la fonction eval() pour créer un nouvel objet à partir de la chaîne :
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)
La sortie est :
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
Le code d'exemple précédent crée l'objet mydate2 à partir de la chaîne repr() pour mydate1, puis vérifie que les valeurs des deux objets sont égales.
__str__() et __repr__() exemples utilisant une nouvelle classe
Lorsque vous créez une classe, vous devez implémenter au moins la méthode ___repr__() afin qu'une information utile soit renvoyée lorsque les fonctions intégrées utilisent __repr__().
La classe suivante n'implémente pas les méthodes __str__() ou __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))
La sortie lorsque vous utilisez str() et repr() est :
<__main__.Ocean object at 0x102892860>
<__main__.Ocean object at 0x102892860>
L'exemple précédent montre que l'implémentation par défaut de __repr()__ pour l'objet retourne une chaîne contenant uniquement la classe et l'id de l'objet au format hexadécimal, ce qui n'est pas très utile. Notez que str() et repr() retournent la même valeur, car str() appelle __repr__() lorsque __str__() n'est pas implémenté.
Mettez à jour la classe Ocean avec des implémentations des méthodes __str__() et __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))
La sortie est :
The creature type is Jellyfish and the age is 5
Ocean('Jellyfish', 5)
L'implémentation de __str__() dans l'exemple précédent renvoie une chaîne facile à lire qui fournit les détails pertinents de l'objet pour un utilisateur. L'implémentation de __repr__() renvoie une chaîne qui est une expression Python valide qui pourrait être utilisée pour recréer l'objet : Ocean('Jellyfish', 5). L'exemple utilise le formatage de chaîne f-string, mais vous pouvez formater les chaînes en utilisant tout format pris en charge par Python.
Conclusion
Dans cet article, vous avez exploré les différences entre les méthodes __str__() et __repr__() et vous avez implémenté ces méthodes spéciales dans une classe, afin que vous n'ayez pas à les appeler directement. Apprenez-en plus sur le travail avec des chaînes en Python grâce à nos tutoriels sur les chaînes en Python.
