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)
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 <class 'dataclasses.FrozenInstanceError'>