À 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)