Classes & dataclasses
Une classe regroupe des données et les fonctions qui les manipulent ; @dataclass écrit à votre place __init__, l'affichage et la comparaison. Utilisez-la pour un enregistrement métier typé.
- class
- objet
- __init__
- self
- méthode
- dataclass
- field
Syntaxe
class Nom: def __init__(self, a): self.a = a # attribut propre à chaque objet def methode(self): ...from dataclasses import dataclass, field@dataclassclass Nom: a: int b: list[str] = field(default_factory=list)Exemple
from dataclasses import dataclass, field@dataclassclass Commande: numero: str client: str lignes: list[tuple[str, float]] = field(default_factory=list) def total(self) -> float: return round(sum(prix for _, prix in self.lignes), 2)c = Commande("C-1042", "Ana")c.lignes.append(("clavier", 49.9))c.lignes.append(("souris", 19.9))print(c.total()) # → 69.8print(c) # → Commande(numero='C-1042', client='Ana', lignes=[('clavier', 49.9), ('souris', 19.9)])print(Commande("C-7", "Bob") == Commande("C-7", "Bob")) # → Trueclass Compteur: def __init__(self): self.valeur = 0 def incrementer(self, pas=1): self.valeur += pas return self.valeurvisites = Compteur()visites.incrementer()print(visites.incrementer(5)) # → 6À retenir
- self désigne l'objet sur lequel la méthode est appelée : c.total() équivaut à Commande.total(c).
- @dataclass génère __init__, __repr__ (affichage lisible) et __eq__ (comparaison champ par champ) à partir des annotations ; frozen=True rend l'objet non modifiable et utilisable comme clé de dictionnaire.
- Piège : un champ mutable ne peut pas recevoir une valeur par défaut directe. lignes: list = [] est refusé par dataclass (ValueError) ; écrivez field(default_factory=list) pour que chaque objet ait sa propre liste.
- Piège : une variable déclarée dans le corps d'une classe classique, hors de __init__, est partagée par toutes les instances. Les données propres à chaque objet s'initialisent dans __init__ avec self.attribut.
- Avant d'écrire une classe, demandez-vous si une fonction et un dictionnaire suffisent ; en analyse de données, un DataFrame remplace souvent une liste d'objets.
Voir aussi
- Annotations de typeLes annotations de type documentent ce qu'une fonction attend et renvoie (list[int], str | None). Python ne les vérifie pas à l'exécution, mais l'éditeur et mypy s'en servent pour repérer les erreurs.
- def — Définir une fonctiondef regroupe un traitement sous un nom, avec des paramètres en entrée et return en sortie. Écrivez une fonction dès qu'un calcul sert deux fois ou mérite d'être vérifié à part.
- DictionnairesUn dictionnaire associe des clés uniques à des valeurs, comme une fiche ou une ligne de table. On s'en sert pour retrouver une information par son identifiant, compter ou regrouper.