Python Academy · leksjon

Definere en dataklasse

Bruk @dataclass for å fjerne standardkode.

Leksjon 1 av 413 trinn

Definere en dataklasse er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 1 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.

Hvorfor dataklasser?

Når De skriver en klasse som hovedsakelig inneholder data, ender De opp med å gjenta den samme standardkoden: en __init__, en __repr__ og en __eq__. Modulen dataclasses genererer alt dette for Dem ut fra enkle felterklæringer.

  • Mindre kode å skrive og lese.
  • Færre muligheter for skrivefeil i __init__.
  • Innebygd i standardbiblioteket siden Python 3.7.

Den gamle måten

Her er en vanlig klasse som lagrer et punkt. Legg merke til hvor mye kode som må skrives bare for å lagre to tall.

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
print(p.x, p.y)

@dataclass-dekoratoren

Bruk @dataclass over en klasse, og erklær felter med typeannotasjoner. Python genererer __init__ automatisk.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p.x, p.y)

Automatisk __repr__

Dataklasser bygger også en lesbar __repr__, slik at utskrift av objektet viser feltene i stedet for en minneadresse.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(3, 4))

Automatisk __eq__

To instanser av en dataklasse sammenlignes som like når alle feltene deres er like. De trenger ikke å skrive __eq__ manuelt.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(1, 2) == Point(1, 2))
print(Point(1, 2) == Point(9, 9))

Typeannotasjoner er obligatoriske

Hvert felt må ha en typeannotasjon. Det er annotasjonen som forteller dataklassemotoren at navnet er et felt. En tilordning uten annotasjon blir et vanlig klasseattributt, ikke et felt.

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

u = User('Alice', 30)
print(u)

Legge til metoder

En dataklasse er fortsatt en vanlig klasse. De kan legge til vanlige metoder som bruker de genererte feltene.

from dataclasses import dataclass

@dataclass
class Rectangle:
    width: int
    height: int

    def area(self):
        return self.width * self.height

r = Rectangle(3, 4)
print(r.area())

Endre felter

Som standard er instanser av dataklasser muterbare, slik at De kan tilordne felter på nytt etter opprettelsen, akkurat som vanlige attributter.

from dataclasses import dataclass

@dataclass
class Counter:
    value: int

c = Counter(0)
c.value += 5
print(c.value)

asdict og astuple

Hjelpefunksjonene asdict() og astuple() konverterer en instans til en ordbok eller tupel, noe som er praktisk ved serialisering.

from dataclasses import dataclass, asdict, astuple

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(asdict(p))
print(astuple(p))

Nestede dataklasser

Et felt i en dataklasse kan selv være en annen dataklasse. Den genererte __repr__-metoden og asdict() går rekursivt inn i nestede strukturer.

from dataclasses import dataclass, asdict

@dataclass
class Address:
    city: str

@dataclass
class Person:
    name: str
    address: Address

p = Person('Bob', Address('Paris'))
print(asdict(p))

Når bør De bruke dataklasser?

Velg en dataklasse når en klasse hovedsakelig samler relaterte verdier.

  • Konfigurasjonsobjekter.
  • Poster som returneres fra en funksjon.
  • Enkle verdityper, som koordinater eller penger.

For klasser som hovedsakelig består av atferd fremfor data, kan en vanlig klasse være enklere å lese.

Kort kontroll

Hva genererer dekoratoren @dataclass automatisk?

Oppsummering

De har lært å bruke @dataclass for å fjerne standardkode.

  • Erklær felter med typeannotasjoner.
  • __init__, __repr__ og __eq__ genereres automatisk.
  • Bruk asdict() og astuple() til å konvertere instanser.
  • De kan fortsatt legge til metoder og bygge inn nestede dataklasser.
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 «Definere en dataklasse» gratis?

Ja – hele teksten i «Definere en dataklasse» 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 «Definere en dataklasse»?

Bruk @dataclass for å fjerne standardkode. 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 1 av 4.

Hvor lang tid tar leksjonen «Definere en dataklasse»?

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