Table des matières

, , , ,

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

Complément