Viss Pitonā ir objekts, vai arī tā saka. Ja vēlaties izveidot savus pielāgotos objektus ar savām īpašībām un metodēm, izmantojiet Python's klasē
iebilst, lai tas notiktu. Bet klašu izveide Python dažreiz nozīmē atkārtotu katlu kodu slodžu rakstīšanu, lai iestatītu klases instanci no tam nodotajiem parametriem vai izveidotu kopīgas funkcijas, piemēram, salīdzināšanas operatorus.
Datu klases, kas ieviestas Python 3.7 (un ar portu Python 3.6), ir ērts veids, kā padarīt klases mazāk verbālas. Daudzas no kopīgajām lietām, ko darāt klasē, piemēram, īpašību iegūšana no klasei nodotajiem argumentiem, var samazināt līdz dažām pamata instrukcijām.
Python datu klases piemērs
Šeit ir vienkāršs parastas klases piemērs Python:
klases grāmata:'' 'Objekts fizisko grāmatu izsekošanai kolekcijā.' ''
def __init __ (pats, nosaukums: str, svars: pludiņš, plaukta_ID: int = 0):
self.name = nosaukums
pašsvars = svars # gramos, lai aprēķinātu piegādi
self.shelf_id = plaukta_id
def __repr __ (pats):
return (f "Grāmata (nosaukums = {self.name! r},
svars = {pašsvars! r}, plaukta_ID = {sevis-plaukts_id! r}) ")
Vislielākās galvassāpes šeit ir veids, kā katrs arguments tika nodots__tajā__
ir jākopē uz objekta īpašībām. Tas nav tik slikti, ja jūs nodarbojaties tikai ar jumsGrāmata
, bet ko darīt, ja jums ir jārisinaGrāmatu plaukts
, Bibliotēka
, Noliktava
, un tā tālāk? Turklāt, jo vairāk kodu jāievada ar roku, jo lielākas iespējas kļūdīties.
Šeit ir tā pati Python klase, kas ieviesta kā Python datu klase:
no dataklasēm importēt dataklasi @dataclass klase Grāmata: '' 'Objekts fizisko grāmatu izsekošanai kolekcijā.' '' nosaukums: str svars: pludiņa plaukts_id: int = 0
Kad jūs norādāt īpašības, ko sauclauki, datu klasē,@dataclass
automātiski ģenerē visu kodu, kas nepieciešams to inicializēšanai. Tas arī saglabā katra īpašuma veida informāciju, tādēļ, ja izmantojat kodu, piemēram,mypy
, tas nodrošinās, ka klases konstruktoram piegādājat pareiza veida mainīgos.
Cita lieta@dataclass
aizkadrā tiek automātiski izveidots kods vairākām klasē izplatītām dunder metodēm. Iepriekšminētajā klasē mums bija jāizveido savs__repr__
. Datu klasē tas nav vajadzīgs;@dataclass
ģenerē__repr__
tev.
Kad datu klase ir izveidota, tā funkcionāli ir identiska parastajai klasei. Par datu klases izmantošanu netiek piemērots izpildes sods, izņemot minimālo dekoratora pieskaitāmo summu, deklarējot klases definīciju.
Pielāgojiet Python datu klases laukus arlaukā
funkciju
Datu klašu noklusējuma darbībai vajadzētu būt lielākai daļai lietošanas gadījumu. Dažreiz jums tomēr ir jāpielāgo, kā tiek inicializēti jūsu datu klases lauki. Lai to izdarītu, varat izmantotlaukā
funkciju.
no datu klasēm importēt datu klasi, lauks no ievades importēt List @dataclass klases grāmata: '' 'Objekts fizisko grāmatu izsekošanai kolekcijā.' 'nosaukums: str nosacījums: str = lauks (salīdzināt = Nepatiesa) svars: pludiņš = lauks (noklusējums = 0.0, repr = False) shelf_id: int = 0 nodaļas: Saraksts [str] = lauks (noklusējuma_fabrika = saraksts)
Iestatot noklusējuma vērtību gadījumamlaukā
, tas maina lauka iestatīšanu atkarībā no tā, kādus parametrus jūs norādātlaukā
. Šīs ir visbiežāk izmantotās opcijas laukā
(ir arī citi):
noklusējums
: Iestata lauka noklusējuma vērtību. Jums jāizmantonoklusējums
ja jūs a) izmantojatlaukā
lai mainītu citus lauka parametrus, un b) virs tā laukā vēlaties iestatīt noklusējuma vērtību. Šajā gadījumā mēs izmantojamnoklusējums
uzstādītsvars
uz0.0
.default_factory
: Norāda funkcijas nosaukumu, kurai nav parametru, kas atgriež kādu objektu kā lauka noklusējuma vērtību. Šajā gadījumā mēs vēlamiesnodaļām
lai tas būtu tukšs saraksts.repr
: Pēc noklusējuma (Patiesi
), kontrolē, vai attiecīgais lauks tiek parādīts automātiski izveidotajā laukā__repr__
datu klasei. Šajā gadījumā mēs nevēlamies, lai grāmatas svars tiktu parādīts__repr__
, tāpēc mēs izmantojamrepr = Nepatiesa
to izlaist.salīdzināt
: Pēc noklusējuma (Patiesi
), ietver lauku datu klasē automātiski ģenerētajās salīdzināšanas metodēs. Lūk, mēs nevēlamiesstāvoklī
jāizmanto kā daļu no divu grāmatu salīdzināšanas, tāpēc mēs iestatījāmsalīdzināt =
Nepatiesa
.
Ņemiet vērā, ka mums bija jāpielāgo lauku secība tā, lai vispirms būtu lauki, kuriem nav noklusējuma.
Izmantot__post_init__
kontrolēt Python datu klases inicializāciju
Šajā brīdī jūs, iespējams, domājat: Ja__tajā__
datu klases metode tiek ģenerēta automātiski, kā es varu kontrolēt init procesu, lai veiktu sīkākas izmaiņas?
Ievadiet__post_init__
metodi. Ja jūs iekļaujat__post_init__
Metode datu klases definīcijā var sniegt norādījumus lauku vai citu gadījumu datu modificēšanai.
no dataklasēm importēt datu klasi, lauks no ievades importēt List @dataclass klases grāmata: '' 'Objekts fizisko grāmatu izsekošanai kolekcijā.' 'nosaukums: str svars: pludiņš = lauks (noklusējums = 0.0, repr = False) shelf_id: int = lauka (init = nepatiesa) nodaļas: saraksts [str] = lauks (noklusējuma rūpnīca = saraksts) nosacījums: str = lauks (noklusējums = "labs", salīdzināt = kļūdains) def __post_init __ (pats): ja pašnoteikums == "izmests ": self.shelf_id = Neviens cits: self.shelf_id = 0
Šajā piemērā mēs esam izveidojuši a__post_init__
metode, ko iestatīt shelf_id
uzNav
ja grāmatas stāvoklis tiek inicializēts kā"Izmests"
. Ievērojiet, kā mēs izmantojamlaukā
lai inicializētushelf_id
, un iettajā
kāNepatiesa
uzlaukā
. Tas nozīmēshelf_id
netiks inicializēts__tajā__
.
IzmantotInitVar
kontrolēt Python datu klases inicializāciju
Vēl viens veids, kā pielāgot Python datu klases iestatīšanu, ir izmantotInitVar
tips. Tas ļauj norādīt lauku, uz kuru tiks pārsūtīts__tajā__
un pēc tam uz__post_init__
, bet netiks saglabāta klases instancē.
Izmantojot InitVar
, varat iestatīt parametrus, iestatot datu klasi, kas tiek izmantota tikai inicializācijas laikā. Piemērs:
no datu klasēm importējiet datu klasi, lauku, InitVar no ievades importa saraksta @ datu klases klases grāmata: '' 'Objekts fizisko grāmatu izsekošanai kolekcijā.' '' nosaukums: str nosacījums: InitVar [str] = Nav svara: pludiņš = lauks (noklusējums = 0.0, repr = Nepatiesa) shelf_id: int = lauka (init = Nepatiesa) nodaļas: Saraksts [str] = lauks (noklusējuma rūpnīca = saraksts) def __post_init __ (sevis, nosacījums): ja nosacījums == "Atmest": self.shelf_id = Neviens cits: self.shelf_id = 0
Lauka veida iestatīšana uzInitVar
(tā apakštips ir faktiskais lauka tips) signalizē uz@dataclass
nevis padarīt šo lauku par datu klases lauku, bet gan nodot datus tālāk__post_init__
kā arguments.
Šajā mūsu versijāGrāmata
klasē, mēs neglabājamstāvoklī
kā lauks klases instancē. Mēs tikai izmantojam stāvoklī
inicializācijas posmā. Ja mēs to atradīsimstāvoklī
tika iestatīts uz"Izmests"
, mēs iestatījāmshelf_id
uzNav
- bet mēs neglabājamstāvoklī
klases instancē.
Kad jāizmanto Python datu klases - un kad tās nelietot
Viens izplatīts scenārijs datu klašu izmantošanai ir nosaukto dubultu aizstājējs. Datu klases piedāvā tādu pašu un daudz ko citu, un tās var padarīt nemainīgas (kā tas ir nosaukumos), vienkārši izmantojot@dataclass (iesaldēts = True)
kā dekorators.
Vēl viens iespējamais izmantošanas gadījums ir ligzdoto vārdnīcu, ar kurām strādāt var būt neveikls, aizstāšana ar ligzdotiem datu klašu gadījumiem. Ja jums ir datu klaseBibliotēka
, ar saraksta rekvizītuplaukti
, jūs varētu izmantot datu klasiReadingRoom
aizpildīt šo sarakstu un pēc tam pievienot metodes, lai ērti piekļūtu ligzdotajiem priekšmetiem (piemēram, grāmatai, kas atrodas plauktā noteiktā telpā).
Bet ne katrai Python klasei jābūt datu klasei. Ja klasi veidojat galvenokārt kā veidu, kā grupēt vairākusstatiskās metodes, nevis kā datu konteiners, jums tas nav jāpadara par datu klasi. Piemēram, parsētājiem kopīgs modelis ir tāds, ka klasei ir abstrakts sintakses koks, jāiet pa koku un jānosūta zvani uz dažādām klases metodēm, pamatojoties uz mezgla tipu. Tā kā parsēšanas klasei ir ļoti maz datu, datu klase šeit nav noderīga.
Kā darīt vairāk ar Python
- Sāciet darbu ar asinhronizāciju Python
- Kā lietot asyncio Python
- Kā izmantot PyInstaller, lai izveidotu Python izpildāmos failus
- Cython apmācība: kā paātrināt Python
- Kā instalēt Python viedajā veidā
- Kā pārvaldīt Python projektus, izmantojot dzeju
- Kā pārvaldīt Python projektus ar Pipenv
- Virtualenv un venv: paskaidrotas virtuālās Python vides
- Python virtualenv un venv do's un don'ts
- Paskaidrots Python vītne un apakšprocesi
- Kā izmantot Python atkļūdotāju
- Kā izmantot Timeit, lai profilētu Python kodu
- Kā izmantot cProfile Python koda profilēšanai
- Kā konvertēt Python uz JavaScript (un atkal atpakaļ)