Programmēšana

Kā izmantot Python datu klases

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 plauktsBibliotēkaNoliktava, 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āizmanto noklusē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ā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ļ)
$config[zx-auto] not found$config[zx-overlay] not found