0Pricing
Python Academy · Lektion

Optionen für Unveränderlichkeit und Vergleiche

Erstellen Sie unveränderliche, sortierbare Dataclasses.

Optionen für Unveränderlichkeit und Vergleiche ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Dekoratoroptionen

Der Dekorator @dataclass akzeptiert Schlüsselwortargumente, die steuern, welche Methoden er erzeugt. Besonders nützlich sind frozen und order.

  • frozen=True macht Instanzen unveränderlich.
  • order=True fügt Vergleichsoperatoren hinzu.

Unveränderliche Dataclasses

Mit frozen=True verhindert die erzeugte Klasse nach der Erstellung die Zuweisung von Attributen. Jeder entsprechende Versuch löst einen FrozenInstanceError aus.

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)

Warum Unveränderlichkeit hilfreich ist

Unveränderliche Objekte sind leichter zu verstehen: Ihr Wert ändert sich nach der Erstellung nie, sodass sie sicher zwischen Funktionen und Threads geteilt werden können. Außerdem können sie sicher als Dictionary-Schlüssel und Elemente von Mengen verwendet werden.

Frozen bedeutet hashbar

Eine eingefrorene Dataclass ist standardmäßig hashbar. Daher können Sie ihre Instanzen in Mengen oder als Wörterbuchschlüssel verwenden. Veränderliche Dataclasses sind nicht hashbar, sofern Sie dies nicht ausdrücklich aktivieren.

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))

Eingefrorene Werte ersetzen

Da Sie eine eingefrorene Instanz nicht verändern können, verwenden Sie dataclasses.replace(), um eine veränderte Kopie zu erstellen. Das Original bleibt unverändert.

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)

Sortierte Dataclasses

Standardmäßig unterstützt eine Dataclass nur ==. Fügen Sie order=True hinzu, um auch <, <=, > und >= zu erzeugen.

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))

So funktioniert der Vergleich bei der Sortierung

Beim Sortieren werden die Felder von links nach rechts als Tupel verglichen, und zwar in der Reihenfolge, in der sie deklariert wurden. Das erste Feld hat die höchste Priorität.

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))

Dataclass-Instanzen sortieren

Da sortierte Dataclasses die Vergleichsoperatoren definieren, können Sie eine Liste davon direkt mit sorted() sortieren.

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)

Den Sortierschlüssel steuern

Wenn Sie nach etwas anderem als der natürlichen Feldreihenfolge sortieren möchten, setzen Sie mit field(init=False) ein verborgenes Sortierfeld an die erste Stelle und legen Sie es in __post_init__ fest. Die anderen Felder können Sie mit compare=False vom Vergleich ausschließen.

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))

Frozen und order kombinieren

Sie können Optionen kombinieren. Eine eingefrorene, sortierte Dataclass ergibt einen idealen unveränderlichen und vergleichbaren Werttyp, beispielsweise für Schlüssel, Versionsnummern oder Koordinaten.

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 und der Standardwert

Die Option eq steuert, ob __eq__ erzeugt wird. Standardmäßig ist sie auf True gesetzt. Beachten Sie, dass order=True eq=True voraussetzt, da die Sortierung auf Gleichheit aufbaut.

from dataclasses import dataclass

@dataclass(eq=True)
class Tag:
    name: str

print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))

Kurzer Test

Was passiert, wenn Sie einem Feld einer eingefrorenen Dataclass-Instanz einen Wert zuweisen?

Zusammenfassung

Sie haben gelernt, unveränderliche und sortierte Dataclasses zu erstellen.

  • frozen=True verhindert Änderungen und macht Instanzen hashbar.
  • Verwenden Sie replace() für veränderte Kopien.
  • order=True erzeugt Vergleichsoperatoren, die Felder als Tupel vergleichen.
  • Kombinieren Sie beide Optionen für robuste Werttypen.

Häufig gestellte Fragen

Ist die Lektion „Optionen für Unveränderlichkeit und Vergleiche“ kostenlos?

Ja — der vollständige Text von „Optionen für Unveränderlichkeit und Vergleiche“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Optionen für Unveränderlichkeit und Vergleiche“?

Erstellen Sie unveränderliche, sortierbare Dataclasses. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Python Academy zu starten?

Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Optionen für Unveränderlichkeit und Vergleiche“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?

Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Eine Dataclass definieren
  2. Standardwerte und field()
  3. Optionen für Unveränderlichkeit und Vergleiche
  4. Die attrs-Bibliothek
← Zurück zu Python Academy