Python Academy · leksjon

Alternativer for frosne og sammenlignbare dataklasser

Lag uforanderlige, ordnede dataklasser.

Leksjon 3 av 413 trinn

Alternativer for frosne og sammenlignbare dataklasser er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Dekoratoralternativer

Dekoratoren @dataclass tar imot nøkkelordargumenter som styrer hvilke metoder den genererer. De mest nyttige er frozen og order.

  • frozen=True gjør instanser uforanderlige.
  • order=True legger til sammenligningsoperatorer.

Uforanderlige dataklasser

Med frozen=True blokkerer den genererte klassen tilordning av attributter etter opprettelsen. Alle forsøk utløser 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)

Hvorfor uforanderlighet er nyttig

Uforanderlige objekter er enklere å forstå: Verdien deres endres aldri etter opprettelsen, så de kan trygt deles mellom funksjoner og tråder. De kan også trygt brukes som nøkler i ordbøker og som medlemmer i mengder.

Frosset betyr hashbar

En frosset dataklasse er som standard hashbar, så du kan bruke instanser i mengder eller som nøkler i ordbøker. Muterbare dataklasser er ikke hashbare med mindre du velger dette eksplisitt.

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

Erstatte frosne verdier

Siden du ikke kan endre en frosset instans, bruker du dataclasses.replace() for å lage en endret kopi. Originalen forblir urørt.

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)

Dataklasser med ordning

Som standard støtter en dataklasse bare ==. Legg til order=True for også å generere <, <=, > og >=.

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

Hvordan sammenligning av rekkefølge fungerer

Ved ordning sammenlignes feltene som en tuple, fra venstre mot høyre, i den rekkefølgen de ble deklarert. Det første feltet har størst betydning.

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

Sortere dataklasseinstanser

Siden dataklasser med ordning definerer sammenligningsoperatorene, kan du sortere en liste med dem direkte ved hjelp av 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)

Styre sorteringsnøkkelen

Hvis du vil sortere etter noe annet enn den naturlige feltrekkefølgen, legger du et skjult sorteringsfelt først med field(init=False) og setter det i __post_init__. De andre feltene kan utelates fra sammenligningen med 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))

Kombinere frozen og order

Du kan kombinere alternativer. En frosset dataklasse med ordning blir en perfekt uforanderlig og sammenlignbar verditype, ideell for nøkler, versjonsnumre eller koordinater.

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 og standardverdien

Alternativet eq styrer om __eq__ genereres. Det er True som standard. Merk at order=True krever eq=True, siden ordning bygger på likhet.

from dataclasses import dataclass

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

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

Kort sjekk

Hva skjer hvis du tilordner en verdi til et felt i en instans av en frosset dataklasse?

Oppsummering

Du har lært å lage uforanderlige dataklasser med ordning.

  • frozen=True hindrer endringer og gjør instanser hashbare.
  • Bruk replace() for å lage endrede kopier.
  • order=True genererer sammenligningsoperatorer som sammenligner feltene som en tuple.
  • Kombiner begge for robuste verdityper.
Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Alternativer for frosne og sammenlignbare dataklasser» gratis?

Ja – hele teksten i «Alternativer for frosne og sammenlignbare dataklasser» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Alternativer for frosne og sammenlignbare dataklasser»?

Lag uforanderlige, ordnede dataklasser. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Alternativer for frosne og sammenlignbare dataklasser»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Definere en dataklasse
  2. Standardverdier og field()
  3. Alternativer for frosne og sammenlignbare dataklasser
  4. attrs-biblioteket
← Tilbake til Python Academy