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 Python commencent et se terminent par un double soulignement et sont informellement connues sous le nom de méthodes dunder. Les méthodes dunder sont les méthodes sous-jacentes des opérateurs et fonctions intégrés de Python. Vous devez éviter d’appeler directement les méthodes dunder, et plutôt implémenter les méthodes dunder dans votre classe et ensuite 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__() retourne une représentation en chaîne lisible par l’homme, 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 plutôt la méthode __repr__().

La méthode __repr__() retourne une représentation en chaîne plus riche en informations, ou officielle, d’un objet. Cette méthode est appelée par la fonction intégrée repr(). Si possible, la chaîne retournée devrait ê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 non ambiguë.

En général, la chaîne __str__() est destinée aux utilisateurs et la chaîne __repr__() est destinée aux développeurs.

Exemples de __str__() et __repr__() Utilisant une Classe Intégrée

Les exemples dans cette section appellent directement les méthodes __str__() et __repr__() à des fins de démonstration.

La classe datetime.datetime est une classe Python intégrée qui a une implémentation par défaut des méthodes __str__() et __repr__().

Le code d’exemple suivant montre les chaînes renvoyé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))

L’output est :

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)

L’output montre que la fonction str() appelle __str__() et renvoie une chaîne conviviale pour 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)

L’output est :

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

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.

Exemples de __str__() et __repr__() en utilisant une nouvelle classe

Lorsque vous créez une classe, vous devez implémenter au moins la méthode __repr__() afin que des informations utiles soient renvoyées 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))

L’output lorsque vous utilisez str() et repr() est :

Output
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>

L’exemple précédent démontre que l’implémentation par défaut de __repr()__ pour l’objet renvoie une chaîne contenant uniquement la classe et l’objet id au format hexadécimal, ce qui n’est pas très utile. Notez que str() et repr() renvoient la même valeur, car str() appelle __repr__() lorsque __str__() n’est pas implémenté.

Mettez à jour la classe Ocean avec les 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:

Output
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 pouvant être utilisée pour recréer l’objet: Ocean('Méduse', 5). L’exemple utilise le formatage f-string pour les chaînes, mais vous pouvez formater les chaînes en utilisant n’importe quel format pris en charge par Python.

Conclusion

Dans cet article, vous avez exploré les différences entre les méthodes __str__() et __repr__() et implémenté ces méthodes spéciales dans une classe, de sorte que vous n’ayez pas besoin de les appeler directement. Apprenez-en davantage sur le travail avec les chaînes de caractères en Python à travers nos tutoriels sur les chaînes de caractères Python.

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions