Hvordan bruke dataklasser i Python

Hvordan bruke dataklasser i Python
Denne artikkelen vil dekke en guide om bruk av de nye "DataClass" -objektene som er inkludert i Python 3.7 og nyere versjoner. Dataklasser er akkurat som andre Python -klasser, men de er spesielt designet for å brukes som databeholdere og gir en renere og kortere syntaks for raskt å lage dataobjekter. Hvis du vet om “Namedtuple” -objekter og har brukt dem i Python, kan du definere dem som Mutable NamedTuple -type objekter. Du kan opprette nye forekomster av dataklasser som alle andre klasse- eller namedtuple -objekter og få tilgang til attributtene deres ved hjelp av DOT -notasjon.

Grunnleggende syntaks og bruk

For å forstå et dataklasse og syntaks, må du forstå den grunnleggende utformingen og strukturen til en Python -klasse først. Nedenfor er et eksempel som viser en enkel Python -klasse:

klasse Stockinhand:
def __init __ (selv, epler, appelsiner, mango):
selv-.epler = epler
selv-.appelsiner = appelsiner
selv-.mango = mango
lager = Stockinhand (40, 50, 60)
trykk (lager.epler, lager.appelsiner, lager.mango)

I kodeprøven ovenfor er en ny klasse kalt "Stockinhand" blitt opprettet med en "__init__" -metode definert inne i den. __Init__ -metoden påberopes automatisk når du oppretter en ny forekomst av Stockinhand -klasse. I dette tilfellet har __init__ -metoden blitt definert med noen obligatoriske argumenter. Så du kan ikke opprette en ny forekomst av Stockinhand uten noen verdier for nødvendige argumenter. "Selv" -argumentet gir en henvisning til forekomsten av en klasse, slik at du kan bruke den til å referere til hvilken som helst variabel eller metode i en klasse så lenge disse variablene og metodene er blitt definert ved å benytte seg av selvargumentet. Selvargumentet fungerer som et bekvemmelighetsverktøy, og det kan kalles hva som helst. Du kan også utelate det helt. I de siste par uttalelsene opprettes det en ny forekomst av Stockinhand -klassen og variablene får tilgang til ved hjelp av DOT -notasjon.

Etter å ha kjørt ovennevnte kodeprøve, bør du få følgende utdata:

40 50 60

Den samme klassen kan defineres ved hjelp av dataklasse som følger:

fra dataklasser importerer dataklasse
@dataclass
klasse Stockinhand:
Epler: Int
Appelsiner: Int
Mango: Int
lager = Stockinhand (40, 50, 60)
trykk (lager.epler, lager.appelsiner, lager.mango)

Den første uttalelsen importerer "DataClass" -dekoratøren fra "DataClasses" -modulen. Dekoratører kan brukes til å endre atferd av Python -objekter uten å endre dem faktisk. I dette tilfellet er dataklasse -dekoratøren forhåndsdefinert og kommer fra dataklassemodulen. For å definere et dataklasse, må du feste dataklassdekoratør ved å bruke "@" -symbol til en Python -klasse, som vist i kodeprøven ovenfor. I de neste utsagnene er variabler i dataklasset definert ved hjelp av type hint for å indikere hvilken type objekt de er. Type hint ble introdusert i Python 3.6 Og de er definert med ":" (kolon) symboler. Du kan opprette en ny forekomst av dataklass som alle andre Python -klasse. Etter å ha kjørt ovennevnte kodeprøve, bør du få følgende utdata:

40 50 60

Merk at hvis en metode i dataklasse returnerer en verdi, kan du tilordne den et type hint ved å bruke "->" -symbol. Her er et eksempel:

fra dataklasser importerer dataklasse
@dataclass
klasse Stockinhand:
Epler: Int
Appelsiner: Int
Mango: Int
def total_stock (selv) -> int:
Returnerer selv.epler + selv.appelsiner + selv.mango
lager = Stockinhand (40, 50, 60)
trykk (lager.total_stock ())

En ny metode som heter "Total_stock" er opprettet, og et type hint ved bruk av "int" reservert nøkkelord er blitt tilordnet det for å indikere typen returverdi. Etter å ha kjørt ovennevnte kodeprøve, bør du få følgende utdata:

150

Variabler i dataklasseobjekter kan ha standardverdier

Du kan tilordne standardverdier til medlemmer av dataklasser etter typen hint. Her er et eksempel:

fra dataklasser importerer dataklasse
@dataclass
klasse Stockinhand:
epler: int = 40
appelsiner: int = 50
Mango: int = 60
def total_stock (selv) -> int:
Returnerer selv.epler + selv.appelsiner + selv.mango
lager = StockInHand ()
trykk (lager.total_stock ())

I den andre siste uttalelsen har det ikke blitt gitt noen argumenter under opprettelse av en ny forekomst av Stockinhand DataClass, så standardverdier er brukt. Etter å ha kjørt ovennevnte kodeprøve, bør du få følgende utdata:

150

Dataklassemedlemmer er mutable

Dataklasser er mutable, slik at du kan endre verdien av medlemmene ved å få en henvisning til dem. Nedenfor er en kodeeksempel:

fra dataklasser importerer dataklasse
@dataclass
klasse Stockinhand:
epler: int = 40
appelsiner: int = 50
Mango: int = 60
def total_stock (selv) -> int:
Returnerer selv.epler + selv.appelsiner + selv.mango
lager = StockInHand ()
lager.epler = 100
trykk (lager.total_stock ())

Verdien av Apples -variabelen er endret før du kaller total_stock -metoden. Etter å ha kjørt ovennevnte kodeprøve, bør du få følgende utdata:

210

Opprette et dataklasse fra en liste

Du kan opprette en dataklasse programmatisk ved hjelp av “make_dataclass” -metoden, som vist i kodeprøven nedenfor:

Importer dataklasse
felt = [("epler", int, 40), ("appelsiner", int, 50), ("mango", int, 60)]
StockinHand = Dataklasser.make_dataclass (
"Stockinhand", felt,
namespace = 'total_stock': lambda selv: selv.epler + selv.appelsiner + selv.mango
)
lager = StockInHand ()
lager.epler = 100
trykk (lager.total_stock ())

Make_dataclass -metoden tar et klassenavn og en liste over medlemsfelt som to obligatoriske argumenter. Du kan definere medlemmer som en liste over tuples der hver tuple inneholder navnet på variabelen, dens type hint og standardverdien. Definere standardverdi er ikke nødvendig, du kan utelate den for å tilordne ingen standardverdi. Det valgfrie navneområdet Argument tar en ordbok som kan brukes til å definere medlemsfunksjoner ved hjelp av nøkkelverdipar og lambda-funksjoner. Koden over tilsvarer nøyaktig å definere følgende dataklasse manuelt:

fra dataklasser importerer dataklasse
@dataclass
klasse Stockinhand:
epler: int = 40
appelsiner: int = 50
Mango: int = 60
def total_stock (selv):
Returnerer selv.epler + selv.appelsiner + selv.mango
lager = StockInHand ()
lager.epler = 100
trykk (lager.total_stock ())

Etter å ha kjørt de to ovennevnte kodeprøvene, bør du få følgende utdata:

210

Hvorfor bruke en dataklasse i stedet for en klasse?

Du lurer kanskje på hvorfor bruk dataklasse hvis de er nesten de samme som andre Python -klasser? En av de viktigste fordelene ved å bruke dataklasse er dens konsisthet. Du kan opprette dataklasser ved hjelp av rene og minimale korthånds uten mye kjeleplate -kode. De er spesielt designet for å brukes som databeholdere der variabler lett kan nås ved hjelp av DOT-notasjon, selv om du også kan bruke dataklasser som fullverdige klasser. Enkelt sagt, hvis du vil bruke en Python -klasse bare for å bruke den som en datalager, ser DataClass ut til å være et bedre valg.

Konklusjon

Dataklasser i Python gir en minimal måte å raskt lage Python -klasser som er ment å brukes som datalagre. Du kan få referanser til medlemmer av dataklasser ved hjelp av DOT-notasjon, og de er spesielt nyttige når du leter etter ordbøker som nøkkelverdipar som kan nås ved hjelp av DOT-notasjon.