À quoi sert __repr__ ?
La méthode spéciale __repr__
permet d'indiquer une chaîne de caractères qui sert de représentation à une classe.
Cette chaîne de caractères est retournée lors de l'utilisation de la fonction repr
sur une instance de la classe.
import datetime
now = datetime.datetime.now()
print(repr(now))
La chaîne de caractères retournée est destinée aux développeurs et sa représentation permet généralement de recréer l'objet en question.
Par exemple, le code ci-dessus nous retourne la chaîne de caractères "datetime.datetime(2021, 1, 13, 10, 24, 45, 116735)"
que nous pouvons utiliser pour recréer l'objet now
:
import datetime
now = datetime.datetime(2021, 1, 13, 10, 24, 45, 116735)
print(now)
Pour implémenter cette méthode, il suffit de la surcharger à l'intérieur d'une classe :
class Utilisateur:
def __init__(self, prenom, nom):
self.prenom = prenom
self.nom = nom
def __repr__(self):
return "Utilisateur(prenom='{}', nom='{}')".format(self.prenom, self.nom)
utilisateur_01 = Utilisateur(prenom="Patrick", nom="Smith")
print(repr(utilisateur_01))
Là encore, nous pouvons prendre le résultat retourné par repr
(Utilisateur(prenom='Patrick', nom='Smith')
) pour recréer l'objet correspondant.
Si vous n'implémentez pas cette méthode dans votre classe, la méthode __repr__
de l'objet object
(dont toutes les classes héritent par défaut) sera utilisée.
Par défaut, la classe (__main__.Utilisateur
) et l'adresse en mémoire de l'instance (0x10f5952e0
) sont affichées :
# On n'implémente pas la méthode __repr__
class Utilisateur:
def __init__(self, prenom, nom):
self.prenom = prenom
self.nom = nom
utilisateur_01 = Utilisateur(prenom="Patrick", nom="Smith")
# Quand on utilise repr sur notre instance, la classe et l'adresse en mémoire de l'instance sont affichées
print(repr(utilisateur_01)) # <__main__.Utilisateur object at 0x10f5952e0>
# Cette implémentation provient de la classe object
print(object.__repr__(utilisateur_01)) # <__main__.Utilisateur object at 0x10f5952e0>
Si vous exécutez le code ci-dessus, l'adresse en mémoire n'est pas affichée car le code est exécuté dans votre navigateur internet)