les dataclasses réduisent le boilerplate des objets “données”.
objectifs
- créer une dataclass immuable
- bénéficier de
__repr__,__eq__,order - gérer des champs mutables proprement
explication détaillée
@dataclass(frozen=True, order=True) :
- objets hashables et comparables
- immuabilité : moins d’effets de bord
field(default_factory=...)pour les champs mutables.
exemples exécutables
from dataclasses import dataclass, field
@dataclass(frozen=True, order=True, slots=True)
class Produit:
prix: float
nom: str
tags: list[str] = field(default_factory=list, compare=False)
p = Produit(9.9, "stylo")
print(p, p == Produit(9.9, "stylo"))
print(sorted([Produit(3,"a"), Produit(2,"b")]))
# mapping léger item -> prix
@dataclass(frozen=True)
class Item:
id: int
name: str
price: float
catalogue = [Item(1,"stylo",2.5), Item(2,"carnet",4.0)]
print({i.id: i for i in catalogue})
bonnes pratiques
- préférer
frozen=Trueetslots=Truequand possible default_factorypour les conteneurs- garder les dataclasses simples (sinon, vraie classe métier)
pièges courants
- oublier
default_factory→ liste partagée - tenter de modifier un champ d’un objet
frozen - comparer des objets avec des champs non comparables
exercices
User(id:int, name:str)immuable et triable parname.- inventaire : liste d’
Item, totaliser le prix. - ajouter un champ
created_at: datetimeavec valeur par défaut (bonus).