Programavimas

Kaip naudoti „Python“ duomenų klases

„Python“ viskas yra objektas, arba taip sakoma. Jei norite sukurti savo pasirinktinius objektus su savo ypatybėmis ir metodais, naudokite „Python“ klasė prieštarauti, kad tai įvyktų. Tačiau kuriant „Python“ klases kartais reikia parašyti daugybę pasikartojančių „boilerplate“ kodų, kad būtų galima nustatyti klasės egzempliorių iš jam perduotų parametrų arba sukurti bendras funkcijas, pavyzdžiui, palyginimo operatorius.

Duomenų klasės, įdiegtos „Python 3.7“ (ir sujungtos su „Python 3.6“), yra patogus būdas, kad klasės būtų mažiau vertingos. Daugelį įprastų dalykų, kuriuos darote klasėje, pvz., Iš karto perduodamų argumentų savybes, galite susiaurinti iki kelių pagrindinių nurodymų.

„Python“ duomenų klasės pavyzdys

Štai paprastas įprastos „Python“ klasės pavyzdys:

klasės knyga:

'' 'Objektas fizinėms knygoms sekti kolekcijoje.' ''

def __init __ (savęs, vardo: str, svoris: plūdės, lentynos_id .: int = 0):

self.name = vardas

savarankiškas svoris = svoris # gramais, apskaičiuojant siuntimą

self.shelf_id = lentynos_id

def __repr __ (savęs):

return (f "Knyga (vardas = {savivardas! r},

svoris = {self.weight! r}, lentynos_id = {self.shelf_id! r}) ")

Didžiausias galvos skausmas čia yra kiekvieno argumento perdavimas__init__ turi būti nukopijuotas į objekto savybes. Tai nėra taip blogai, jei jūs užsiimate tik tuoKnyga, bet kas, jei teks susidurtiKnygų lentynaBibliotekaSandėlis, ir taip toliau? Be to, kuo daugiau kodo turite įvesti ranka, tuo didesnė tikimybė, kad suklysite.

Čia yra ta pati „Python“ klasė, įdiegta kaip „Python“ duomenų klasė:

iš duomenų klasių importuoti dataclass @dataclass klasė Knyga: '' 'Objektas fizinėms knygoms sekti kolekcijoje.' '' pavadinimas: str svoris: float shelf_id: int = 0 

Kai nurodote ypatybes, vadinamaslaukai, duomenų klasėje,@dataclass automatiškai sugeneruoja visą kodą, reikalingą jiems inicializuoti. Taip pat išsaugoma kiekvienos nuosavybės tipo informacija, taigi, jei naudojate kodą, panašų įmypy, tai užtikrins, kad jūs pateikiate tinkamų rūšių kintamuosius klasės konstruktoriui.

Dar vienas dalykas@dataclass „Užkulisiuose“ automatiškai sukuria kodą daugeliui bendrų „dunder“ metodų klasėje. Aukščiau pateiktoje įprastoje klasėje turėjome sukurti savo__repr__. Duomenų klasėje tai nereikalinga;@dataclass generuoja__repr__ tau.

Sukūrus duomenų klasę, ji funkciškai identiška įprastai klasei. Už duomenų klasės naudojimą nėra baudos, išskyrus minimalią dekoratoriaus pridėtinę kainą deklaruojant klasės apibrėžimą.

Tinkinkite „Python“ duomenų klasės laukus naudodamisrityje funkcija

Numatytasis duomenų klasių veikimo būdas turėtų būti tinkamas daugeliu atvejų. Tačiau kartais reikia tiksliai sureguliuoti, kaip inicijuojami jūsų duomenų klasės laukai. Norėdami tai padaryti, galite naudotisrityje funkcija.

iš duomenų klasių importuoti duomenų klasę, laukas įrašant importuoti List @dataclass class Book: '' 'Objektas fizinėms knygoms sekti kolekcijoje.' 'pavadinimas: str condition: str = field (palyginti = False) weight: float = field (default = 0.0, repr = klaidinga) shelf_id: int = 0 skyriai: sąrašas [str] = laukas (numatytasis fabrikas = sąrašas) 

Kai nustatote numatytąją reikšmę egzemplioriuisrityje, tai keičia lauko nustatymo būdą, atsižvelgiant į tai, kokius parametrus pateikiatesrityje. Tai yra dažniausiai naudojamos parinktys srityje (yra ir kitų):

  • numatytas: Nustato numatytąją lauko vertę. Jums reikia naudoti numatytas jei jūs a) naudojatesrityje norėdami pakeisti bet kokius kitus lauko parametrus, ir b) lauke norite nustatyti numatytąją vertę. Šiuo atveju mes naudojamenumatytas nustatytisvoris į0.0.
  • default_factory: Pateikia funkcijos, kuri nereikalauja jokių parametrų, kuri grąžina objektą kaip numatytąją lauko vertę, pavadinimą. Šiuo atveju mes norimeskyriai kad būtų tuščias sąrašas.
  • repr: Pagal numatytuosius nustatymus (Tiesa), valdo, ar atitinkamas laukas rodomas automatiškai sugeneruotame__repr__ duomenų klasei. Šiuo atveju mes nenorime, kad knygos svoris būtų rodomas__repr__, todėl mes naudojamerepr = klaidinga jo praleisti.
  • palyginti: Pagal numatytuosius nustatymus (Tiesa), įtraukia lauką į duomenų klasei automatiškai sukurtus palyginimo metodus. Čia mes nenorimebūklė bus naudojamas kaip dviejų knygų palyginimo dalis, todėl mes nustatėmepalyginti =Klaidinga.

Atkreipkite dėmesį, kad mes turėjome pakoreguoti laukų tvarką taip, kad pirmiausia būtų numatytieji laukai.

Naudokite__post_init__ valdyti „Python“ duomenų klasės inicijavimą

Šiuo metu jums tikriausiai įdomu: jei__init__ Duomenų klasės metodas generuojamas automatiškai, kaip man kontroliuoti init procesą, norint atlikti smulkesnius pakeitimus?

Įveskite__post_init__ metodas. Jei įtraukiate__post_init__ metodas duomenų klasės apibrėžime, galite pateikti nurodymus, kaip modifikuoti laukus ar kitus egzempliorių duomenis.

iš duomenų klasių importuoti duomenų klasę, laukas įrašant importuoti sąrašą @dataclass klasė Knyga: '' 'Objektas fizinėms knygoms sekti kolekcijoje.' 'pavadinimas: str svoris: plūdė = laukas (numatytasis = 0.0, repr = klaidingas) shelf_id: int = laukas (init = klaidingas) skyriai: sąrašas [str] = laukas (numatytasis fabrikas = sąrašas) sąlyga: str = laukas (numatytasis = "geras", palyginkite = klaidingas) def __post_init __ (savarankiškai): jei sav. sąlyga == "atmesta ": self.shelf_id = Niekas kitas: self.shelf_id = 0 

Šiame pavyzdyje sukūrėme a__post_init__ metodas nustatyti lentynos_ID įNė vienas jei knygos būklė inicijuojama kaip"Atmesta". Atkreipkite dėmesį, kaip mes naudojamesrityje inicijuotilentynos_IDir praeitiinic kaipKlaidinga įsrityje. Tai reiškialentynos_ID nebus inicijuota__init__.

NaudokiteInitVar valdyti „Python“ duomenų klasės inicijavimą

Kitas būdas pritaikyti „Python“ duomenų klasės nustatymą yra naudotiInitVar tipo. Tai leidžia nurodyti lauką, kuriam bus perduota__init__ o paskui į__post_init__, bet nebus saugomi klasės egzemplioriuje.

Naudojant InitVar, galite nustatyti parametrus nustatydami duomenų klasę, kuri naudojama tik inicializuojant. Pavyzdys:

iš duomenų klasių importuokite duomenų klasę, lauką, „InitVar“ įvesdami importo sąrašą @dataclass klasė Knyga: '' 'Objektas fizinių knygų stebėjimui kolekcijoje.' '' pavadinimas: str sąlyga: InitVar [str] = Nėra svorio: float = laukas (numatytasis = 0.0, repr = klaidinga) shelf_id: int = lauko (init = False) skyriai: sąrašas [str] = laukas (numatytasis fabrikas = sąrašas) def __post_init __ (savarankiškai, sąlyga): jei sąlyga == "atmesta": sav.lentelės_id = Niekas kitas: self.shelf_id = 0 

Lauko tipo nustatymas įInitVar (kurio potipis yra tikrasis lauko tipas) signalai@dataclass ne padaryti tą lauką į duomenų klasės lauką, bet perduoti duomenis__post_init__ kaip argumentą.

Šioje mūsų versijojeKnyga klasės, nesaugomebūklė kaip laukas klasės egzemplioriuje. Mes tik naudojame būklė inicializavimo etape. Jei tai rasimebūklė buvo nustatytas į"Atmesta", mes nustatėmelentynos_ID įNė vienas - bet mes nesaugomebūklė klasės instancijoje.

Kada naudoti „Python“ duomenų klases - ir kada jų nenaudoti

Vienas dažnas duomenų klasių naudojimo scenarijus yra pavadinimo paketo pakeitimas. Duomenų klasės siūlo tą patį elgesį ir daugiau, ir jas galima padaryti nekintamomis (kaip yra įvardintaisiais) paprasčiausiai naudojant@dataclass (užšaldyta = tiesa) kaip dekoratorė.

Kitas galimas naudojimo atvejis yra įdėtų žodynų, kuriuose dirbti gali būti nepatogu, pakeitimas įdėtomis duomenų klasių egzemplioriais. Jei turite duomenų klasęBiblioteka, su sąrašo ypatybelentynos, galite naudoti duomenų klasęSkaitymo kambarys užpildyti tą sąrašą ir tada pridėti metodų, kad būtų lengviau pasiekti įdėtus daiktus (pvz., knygą lentynoje tam tikrame kambaryje).

Bet ne kiekviena „Python“ klasė turi būti duomenų klasė. Jei kuriate klasę daugiausia kaip grupę grupiųstatiniai metodai, o ne kaip duomenų talpyklą, jums nereikia jų padaryti kaip duomenų klasės. Pavyzdžiui, įprasta analizatorių schema yra turėti klasę, kuri ima abstrakčią sintaksės medį, eina medžiu ir siunčia skambučius į skirtingus klasės metodus pagal mazgo tipą. Kadangi analizatoriaus klasė turi labai mažai savo duomenų, duomenų klasė čia nėra naudinga.

Kaip padaryti daugiau su „Python“

  • Pradėkite naudoti „Python“ asinchronizavimą
  • Kaip naudoti „asyncio“ Python
  • Kaip naudoti „PyInstaller“, norint sukurti „Python“ vykdomuosius failus
  • „Cython“ pamoka: kaip pagreitinti „Python“
  • Kaip įdiegti „Python“ išmaniuoju būdu
  • Kaip valdyti „Python“ projektus naudojant „Poeziją“
  • Kaip valdyti „Python“ projektus naudojant „Pipenv“
  • „Virtualenv“ ir „venv“: paaiškintos „Python“ virtualios aplinkos
  • „Python virtualenv“ ir „venv do and donts“
  • Paaiškinta „Python“ sriegimas ir antriniai procesai
  • Kaip naudotis „Python“ derintuvu
  • Kaip naudoti „Timeit“, kad būtų galima nustatyti „Python“ kodą
  • Kaip naudoti „cProfile“ „Python“ kodui nustatyti
  • Kaip konvertuoti „Python“ į „JavaScript“ (ir dar kartą)
$config[zx-auto] not found$config[zx-overlay] not found