0Pricing
Python Academy · Leçon

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=True rend les instances immuables.
  • order=True ajoute 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=True bloque toute modification et rend les instances hachables.
  • Utilisez replace() pour créer des copies modifiées.
  • order=True gé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

  1. Définir une classe de données
  2. Valeurs par défaut et field()
  3. Options d'immutabilité et de comparaison
  4. La bibliothèque attrs
← Retour à Python Academy