{{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.