Python Academy · Lektion

Definiera en dataklass

Använd @dataclass för att slippa standardkod.

Lektion 1 av 413 steg

Definiera en dataklass är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Varför dataclasses?

När ni skriver en klass som huvudsakligen innehåller data upprepar ni ofta samma standardkod: en __init__, en __repr__ och en __eq__. Modulen dataclasses genererar allt detta åt er utifrån enkla fältdeklarationer.

  • Mindre kod att skriva och läsa.
  • Mindre risk för stavfel i __init__.
  • Ingår i standardbiblioteket sedan Python 3.7.

Det gamla sättet

Här är en vanlig klass som lagrar en punkt. Lägg märke till hur mycket kod som krävs bara för att lagra två tal.

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

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

Dekoratorn @dataclass

Ange @dataclass ovanför en klass och deklarera fält med typannoteringar. Python genererar __init__ automatiskt.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

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

Automatisk __repr__

Dataclasses skapar också en läsbar __repr__, så när objektet skrivs ut visas dess fält i stället för en minnesadress.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(3, 4))

Automatisk __eq__

Två dataclass-instanser jämförs som lika när alla deras fält är lika. Ni behöver inte skriva __eq__ för hand.

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

Typannoteringar krävs

Varje fält måste ha en typannotering. Det är annoteringen som talar om för dataclass-mekanismen att namnet är ett fält. En tilldelning utan annotering blir ett vanligt klassattribut, inte ett fält.

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

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

Lägga till metoder

En dataclass är fortfarande en vanlig klass. Ni kan lägga till vanliga metoder som använder de genererade fälten.

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

Ändra fält

Som standard kan dataclass-instanser ändras, så ni kan tilldela om fält efter att instansen har skapats, precis som vanliga attribut.

from dataclasses import dataclass

@dataclass
class Counter:
    value: int

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

asdict och astuple

Hjälpfunktionerna asdict() och astuple() omvandlar en instans till en ordbok eller tupel, vilket är praktiskt vid serialisering.

from dataclasses import dataclass, asdict, astuple

@dataclass
class Point:
    x: int
    y: int

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

Nästlade dataclasses

Ett dataclass-fält kan själv vara en annan dataclass. Den genererade __repr__ och asdict() går rekursivt igenom nästlade 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 dataclasses bör användas

Använd en dataclass när en klass huvudsakligen grupperar relaterade värden.

  • Konfigurationsobjekt.
  • Poster som returneras från en funktion.
  • Enkla värdetyper som koordinater eller pengar.

För klasser som främst består av beteende snarare än data kan en vanlig klass vara tydligare.

Snabb kontroll

Vad genererar dekoratorn @dataclass automatiskt?

Sammanfattning

Ni har lärt er att använda @dataclass för att ta bort standardkod.

  • Deklarera fält med typannoteringar.
  • __init__, __repr__ och __eq__ genereras automatiskt.
  • Använd asdict() och astuple() för att omvandla instanser.
  • Ni kan fortfarande lägga till metoder och nästla dataclasses.
Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”Definiera en dataklass” gratis?

Ja – hela texten till ”Definiera en dataklass” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Definiera en dataklass”?

Använd @dataclass för att slippa standardkod. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Definiera en dataklass”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Definiera en dataklass
  2. Standardvärden och field()
  3. Alternativ för frysta och jämförbara dataklasser
  4. Biblioteket attrs
← Tillbaka till Python Academy