Options d'immutabilité et de comparaison
Créez des classes de données immuables et ordonnées.
Options d'immutabilité et de comparaison est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Options du décorateur
Le décorateur @dataclass accepte des arguments nommés qui contrôlent les méthodes qu'il génère. Les plus utiles sont frozen et order.
frozen=Truerend les instances immuables.order=Trueajoute les opérateurs de comparaison.
Classes de données immuables
Avec frozen=True, la classe générée bloque l'affectation d'attributs après la construction. Toute tentative déclenche une FrozenInstanceError.
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)Pourquoi l'immuabilité est utile
Les objets immuables sont plus faciles à comprendre : leur valeur ne change jamais après leur création, ce qui permet de les partager sans risque entre des fonctions et des threads. Ils peuvent également être utilisés sans risque comme clés de dictionnaire et éléments d'ensemble.
Les classes de données figées sont hachables
Une classe de données figée est hachable par défaut. Vous pouvez donc utiliser ses instances dans des ensembles ou comme clés de dictionnaire. Les classes de données mutables ne sont pas hachables, sauf si vous activez explicitement cette fonctionnalité.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))Remplacer des valeurs figées
Comme vous ne pouvez pas modifier une instance figée, utilisez dataclasses.replace() pour créer une copie modifiée. L'original reste intact.
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)Classes de données ordonnées
Par défaut, une classe de données prend uniquement en charge ==. Ajoutez order=True pour générer également <, <=, > et >=.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))Fonctionnement de la comparaison
La comparaison de l'ordre considère les champs comme un tuple, de gauche à droite, dans l'ordre où ils ont été déclarés. Le premier champ est le plus significatif.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))Trier des instances de classes de données
Comme les classes de données ordonnées définissent les opérateurs de comparaison, vous pouvez trier directement une liste d'instances avec sorted().
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)Contrôler la clé de tri
Pour trier selon un critère différent de l'ordre naturel des champs, placez d'abord un champ de tri masqué avec field(init=False) et définissez sa valeur dans __post_init__. Vous pouvez exclure les autres champs de la comparaison avec compare=False.
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))Combiner le mode figé et le tri
Vous pouvez combiner ces options. Une classe de données figée et ordonnée constitue un type de valeur immuable et comparable idéal pour les clés, les numéros de version ou les coordonnées.
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])eq et la valeur par défaut
L'option eq contrôle la génération de __eq__. Elle vaut True par défaut. Notez que order=True exige eq=True, car la comparaison de l'ordre repose sur l'égalité.
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))Vérification rapide
Que se passe-t-il si vous affectez une valeur à un champ d'une instance de classe de données figée ?
Récapitulatif
Vous avez appris à créer des classes de données immuables et ordonnées.
frozen=Truebloque toute modification et rend les instances hachables.- Utilisez
replace()pour créer des copies modifiées. order=Truegénère des opérateurs de comparaison qui comparent les champs comme un tuple.- Combinez les deux pour obtenir des types de valeurs fiables.
Questions Fréquemment Posées
La leçon « Options d'immutabilité et de comparaison » est-elle gratuite ?
Oui — le texte complet de « Options d'immutabilité et de comparaison » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Options d'immutabilité et de comparaison » ?
Créez des classes de données immuables et ordonnées. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Options d'immutabilité et de comparaison » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Définir une classe de données
- Valeurs par défaut et field()
- Options d'immutabilité et de comparaison
- La bibliothèque attrs