__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).
Exemple
#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)])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
#class Nom:
def __str__(self):
return "description pour l’utilisateur"
def __repr__(self):
return "Nom(...)"Plus d’exemples
#class Course:
def __init__(self, title):
self.title = title
print(Course("Python"))Le résultat ressemble à ceci : <__main__.Course object at 0x104f3a2d0>. L’adresse mémoire change à chaque exécution.
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}")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!rpour que le résultat contienne des guillemets et ressemble à du code :f"Student({self.name!r})". @dataclassgénère__repr__automatiquement à partir des champs de la classe.
Entrées associées
#- str()Convertit une valeur en chaîne.
- print()Affiche des valeurs sur la sortie standard, la console par défaut.
- @dataclassUn décorateur qui génère __init__, __repr__ et __eq__ à partir des champs annotés d’une classe qui sert à stocker des données.
- Méthodes spécialesDes méthodes à double underscore qui permettent aux objets de fonctionner avec les opérateurs ==, <, +, in et avec la fonction len().
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.