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=Truemacht Instanzen unveränderlich.order=Truefü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=Trueverhindert Änderungen und macht Instanzen hashbar.- Verwenden Sie
replace()für veränderte Kopien. order=Trueerzeugt 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
- Eine Dataclass definieren
- Standardwerte und field()
- Optionen für Unveränderlichkeit und Vergleiche
- Die attrs-Bibliothek