__str__() et __repr__()

Des méthodes qui définissent l’apparence textuelle d’un objet : lisible pour l’utilisateur (__str__) et technique pour le programmeur (__repr__).

Renvoie
Les deux méthodes doivent renvoyer une chaîne (str).
Sur cette page

Exemple

#
Python
class Student:
    def __init__(self, name, points):
        self.name = name
        self.points = points

    def __str__(self):
        return f"{self.name} ({self.points} pts)"

    def __repr__(self):
        return f"Student({self.name!r}, {self.points})"

léa = Student("Léa", 250)

print(léa)
print(f"Leader : {léa}")
print(repr(léa))
print([léa, Student("Lucas", 90)])
Résultatrésultat enregistré, vous pouvez le vérifier
Léa (250 pts)
Leader : Léa (250 pts)
Student('Léa', 250)
[Student('Léa', 250), Student('Lucas', 90)]

Définition et utilisation

#

Sans ces méthodes, print(objet) affiche quelque chose comme <__main__.Student object at 0x...>, ce qui n’apprend pas grand-chose. La méthode __str__ renvoie une description lisible de l’objet, destinée à l’utilisateur. Elle est utilisée par print(), str() et les f-strings.

La méthode __repr__ renvoie une description technique, utile pour chercher des bugs. Une bonne représentation ressemble au code qui crée ce même objet, par ex. Student("Léa", 250). Elle est utilisée par la fonction repr(), par la console interactive quand vous tapez le nom d’une variable, et par l’affichage d’une collection : une liste d’objets dans print() montre le repr de chaque élément.

Si une classe n’a que __repr__, Python l’utilise aussi à la place du __str__ manquant. C’est pourquoi, quand vous n’écrivez qu’une seule de ces méthodes, commencez par __repr__. Dans un f-string, vous forcez la version technique avec le suffixe !r, par ex. f"{objet!r}". Dans la méthode __repr__ elle-même, ce suffixe ajoute des guillemets autour des chaînes.

Syntaxe

#
Syntaxe
class Nom:
    def __str__(self):
        return "description pour l’utilisateur"

    def __repr__(self):
        return "Nom(...)"

Plus d’exemples

#
L’apparence par défaut d’un objet
Python
class Course:
    def __init__(self, title):
        self.title = title

print(Course("Python"))
Résultat
Cliquez sur Exécuter pour voir le résultat.

Le résultat ressemble à ceci : <__main__.Course object at 0x104f3a2d0>. L’adresse mémoire change à chaque exécution.

__repr__ seul suffit pour les deux
Python
class Badge:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Badge({self.name!r})"

badge = Badge("Série de 7 jours")
print(badge)
print(str(badge) == repr(badge))
print(f"Obtenu : {badge!r}")
Résultatrésultat enregistré, vous pouvez le vérifier
Badge('Série de 7 jours')
True
Obtenu : Badge('Série de 7 jours')

Bonnes pratiques

#
  • Si vous n’écrivez qu’une seule de ces méthodes, choisissez __repr__. Elle sert aussi de __str__, et elle aide beaucoup à chercher des bugs.
  • Dans __repr__, formatez les chaînes avec !r pour que le résultat contienne des guillemets et ressemble à du code : f"Student({self.name!r})".
  • @dataclass génère __repr__ automatiquement à partir des champs de la classe.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.