Python Academy · Lektion

Definér en dataclass

Brug @dataclass til at fjerne boilerplate-kode.

Lektion 1 af 413 trin

Definér en dataclass er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.

Hvorfor dataclasses?

Når du skriver en klasse, der primært indeholder data, ender du med at gentage den samme standardkode: en __init__, en __repr__ og en __eq__. Modulet dataclasses genererer det hele for dig ud fra enkle feltdeklarationer.

  • Mindre kode at skrive og læse.
  • Færre muligheder for tastefejl i __init__.
  • Indbygget i standardbiblioteket siden Python 3.7.

Den gamle måde

Her er en almindelig klasse, der gemmer et punkt. Bemærk, hvor meget kode du skal skrive for blot at gemme to tal.

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

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

Dekoratoren @dataclass

Anvend @dataclass over en klasse, og deklarér felter med typeannoteringer. Python genererer automatisk __init__.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

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

Automatisk __repr__

Dataclasses opbygger også en læsbar __repr__, så udskrivning af objektet viser dets felter i stedet for en hukommelsesadresse.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(3, 4))

Automatisk __eq__

To dataclass-instanser er ens, når alle deres felter er ens. Du behøver 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))

Typeannoteringer er obligatoriske

Hvert felt skal have en typeannotering. Det er annoteringen, der fortæller dataclass-mekanismen, at navnet er et felt. En bar tildeling uden annotering bliver en almindelig klasseattribut, ikke et felt.

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

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

Tilføjelse af metoder

En dataclass er stadig en almindelig klasse. Du kan tilføje almindelige metoder, der bruger de genererede felter.

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

Ændring af felter

Som standard kan dataclass-instanser ændres, så du kan tildele felter igen efter oprettelsen ligesom normale attributter.

from dataclasses import dataclass

@dataclass
class Counter:
    value: int

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

asdict og astuple

Hjælpefunktionerne asdict() og astuple() konverterer en instans til en ordbog eller tupel, hvilket er praktisk til serialisering.

from dataclasses import dataclass, asdict, astuple

@dataclass
class Point:
    x: int
    y: int

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

Indlejrede dataclasses

Et dataclass-felt kan selv være en anden dataclass. Den genererede __repr__ og asdict() går rekursivt ned i indlejrede 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))

Hvornår skal du bruge dataclasses?

Vælg en dataclass, når en klasse primært samler relaterede værdier.

  • Konfigurationsobjekter.
  • Poster, som en funktion returnerer.
  • Enkle værdityper som koordinater eller penge.

For klasser, hvor adfærd fylder mere end data, kan en almindelig klasse være lettere at læse.

Hurtigt tjek

Hvad genererer dekoratoren @dataclass automatisk?

Opsummering

Du har lært at bruge @dataclass til at fjerne standardkode.

  • Deklarér felter med typeannoteringer.
  • __init__, __repr__ og __eq__ genereres automatisk.
  • Brug asdict() og astuple() til at konvertere instanser.
  • Du kan stadig tilføje metoder og indlejre dataclasses.
Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
76
Lektioner
320

Ofte stillede spørgsmål

Er lektionen “Definér en dataclass” gratis?

Ja — hele teksten til “Definér en dataclass” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Definér en dataclass”?

Brug @dataclass til at fjerne boilerplate-kode. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Python Academy?

Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Definér en dataclass”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Python Academy-lektion?

Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Definér en dataclass
  2. Standardværdier og field()
  3. Indstillinger for frozen og sammenligning
  4. attrs-biblioteket
← Tilbage til Python Academy