{{tag>cours python dev dataclass decorateur}} ====== Python: les dataclasses ====== Python 3.7 introduit une nouveauté pour simplifier la définition de classes dites "de données"; ce type de classes s'applique pour des objets qui sont essentiellement un assemblage de quelques champs de données. La raison d'être de **dataclass** est de fournir un autre moyen de définir des classes d'enregistrements. Voici par exemple comment on pourrait définir une classe Personne: from dataclasses import dataclass @dataclass class Personne: nom: str age: int email: str = "" p = Personne(nom='jean', age=12) print(p) ===== Instances non mutables ===== Le décorateur dataclass accepte divers arguments pour choisir le comportement de certains aspects de la classe. Reportez-vous à la documentation pour une liste complète, mais voici un exemple qui utilise %%frozen=True%% et qui illustre la possibilité de créer des instances non mutables. Nous retrouvons ici le même scénario d'ensemble de points que nous avons déjà rencontré plusieurs fois : from dataclasses import dataclass @dataclass(frozen=True) class Point: x: float y: float def __eq__(self, other): return self.x == other.x and self.y == other.y def __hash__(self): return (11 * self.x + self.y) // 16 p1, p2, p3 = Point(1, 1), Point(1, 1), Point(1, 1) s = {p1, p2} len(s) 1 p3 in s True try: p1.x = 10 except Exception as e: print(f"OOPS {type(e)}") OOPS ===== Complément ===== * [[https://www.python.org/dev/peps/pep-0557/|PEP 557]] qui a abouti au consensus; * La [[https://docs.python.org/3/library/dataclasses.html|documentation officielle]] du module.