Aller au contenu
Classes & objets

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

Modèle
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

Exemple concret
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

  1. self désigne l'objet sur lequel la méthode est appelée : c.total() équivaut à Commande.total(c).
  2. @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.
  3. 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.
  4. 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.
  5. 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