„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ų lentyna
, Biblioteka
, Sandė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 naudotinumatytas
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_ID
ir 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ą)