Explication de la leçon
Après cette leçon, tu seras capable de :
__str__.__str__ et __repr__, orienté vers les développeurs.@dataclass avec des champs typés.Python appelle les méthodes dont le nom commence et se termine par un double trait de soulignement comme __str__ et __repr__ des méthodes spéciales (ou dunder methods). str(obj) et print(obj) utilisent __str__ lorsqu'elle est présente. repr(obj) est destinée à aider les développeurs à inspecter un objet ; par défaut, Python peut afficher une représentation générique classe-et-adresse.
Pour les classes axées sur les données, @dataclass du module dataclasses crée automatiquement des méthodes courantes basées sur les champs déclarés et annotés avec des types. Cela inclut un initialiseur, une représentation utile et l'égalité basée sur les valeurs (==). Les annotations de type décrivent les champs ; elles ne valident pas automatiquement les types au moment de l'exécution.
Tu peux toujours définir ton propre __str__ sur une dataclass pour contrôler l'affichage tout en conservant son initialiseur et son égalité générés. Préfère les dataclasses pour les enregistrements structurés simples ; conserve les comportements complexes à l'intérieur de classes ordinaires lorsque cela apporte plus de clarté.
__str__ lisibleclass Server:
def __init__(self, name, region):
self.name = name
self.region = region
def __str__(self):
return f"{self.name}@{self.region}"
print(Server("worker", "eu"))Sortie :
worker@eu__str__ doit renvoyer une chaîne de caractères, et non l'afficher.
Cette classe définit les deux représentations pour des publics différents.
class Build:
def __init__(self, number):
self.number = number
def __str__(self):
return f"Build #{self.number}"
def __repr__(self):
return f"Build(number={self.number})"
build = Build(9)
print(str(build))
print(repr(build))Sortie :
Build #9
Build(number=9)@dataclass créer l'initialiseurfrom dataclasses import dataclass
@dataclass
class Job:
name: str
retries: int
job = Job("backup", 2)
print(job.name)
print(repr(job))Sortie :
backup
Job(name='backup', retries=2)Les champs deviennent automatiquement les paramètres du constructeur.
Deux instances différentes peuvent toujours représenter des données égales.
from dataclasses import dataclass
@dataclass
class Version:
component: str
major: int
first = Version("api", 2)
second = Version("api", 2)
print(first == second)
print(first is second)Sortie :
True
False| Besoin | Python |
|---|---|
| Chaîne conviviale pour les humains | __str__(self) renvoie du texte |
| Représentation développeur | __repr__(self) renvoie du texte |
| Constructeur de données | @dataclass avec champs annotés |
| Mêmes valeurs de champs | first == second |
| Exactement le même objet | first is second |
None depuis __str__ ; Python exige une chaîne de caractères.is pour comparer des enregistrements de données indépendants par valeur.@dataclass empêche d'écrire des méthodes personnalisées ; tu peux toujours personnaliser le comportement.