Python

Vadnica za deskriptorje Pythona

Vadnica za deskriptorje Pythona
Uporabno tehniko pisanja generične kode, ki bi jo lahko ponovno uporabili med razredi, podpirajo opisniki Python ali bolj znani kot deskriptorji. Morda se slišijo pojmu dedovanja, vendar niso. To je neposredna tehnika zajemanja dostopa do atributov, ki so zavezujoče narave. Deskriptorji so osnovna funkcija Pythona, ki ureja veliko čarovništva, skrito pod pokrovom jezika. Če ste že kdaj začutili, da so deskriptorji Pythona z malo funkcionalnimi izvedbami napredna tema, potem je ta vadnica najboljša platforma za razumevanje te zmogljive funkcije.

Metode deskriptorjev

Jasno rečeno, razred, ki izvaja __get_ (), __set () _, ali __delete () _ funkcija protokola deskriptorja za objekt je razvrščena kot „deskriptor“. Za urejanje parametrov različnih razredov, ki uporabljajo predmet kot referenco, so narejeni deskriptorji Python. Tu so tri določene metode, ki bodo uporabljene v deskriptorjih:

__get __ (): Ko poskušate izvleči podatke, se __get __ () se pokliče atribut in vse, kar zagotavlja, je tisto, kar bi bilo dano kodi, ki zahteva vrednost ene spremenljivke. Kategoriziran je kot deskriptor brez podatkov in je berljiv.

__set __ (): Funkcija __set __ () se pokliče za prilagoditev vrednosti parametrov in vam ta funkcija ne vrne ničesar. Znan je kot deskriptor podatkov, ki ni le berljiv, ampak tudi zapisljiv.

__izbriši __ (): Kadar koli je parameter odstranjen iz predmeta, se __izbriši __ () funkcija. Znan je kot deskriptor podatkov, ki ni le berljiv, ampak tudi zapisljiv.

Protokol deskriptorja morate uveljaviti le, če v skriptu uporabljate deskriptorje Python. Najpomembnejše funkcije protokola so dobili () in set () z naslednjim podpisom.

__get __ (self, obj, type = None) -> objekt
__set __ (self, obj, value) -> None

sebe je primerek deskriptorja.
obj je primerek predmeta, na katerega je povezan vaš deskriptor.
tip je vrsta predmeta.

Primer:

Tu smo opredelili dva razreda. V razredu Descriptor smo definirali metode deskriptorjev. V dobili (), lastnost je primerek za deskriptor 'val', dobil bo vrednost 'Geeks' in jo shrani. Potem bo med navedenim atributom ustvaril niz z znakom 'for'. deskriptor razreda (objekt):

def __get __ (self, obj, objtype):
vrni » za «.format (samo.val, jaz.val)

Nato bo vrnil vrednost metodi set (). Ta funkcija nato preveri vrednost, ne glede na to, ali gre za niz ali ne. V primeru, da je vrednost niz, bo shranjena v atribut z imenom 'val'. Če vrednost ni niz, bo vrgla izjemo.

def __set __ (self, obj, val):
if isinstance (val, str):
sebe.val = val
sicer:
dvig TypeError ("Ime mora biti niz")

Po tem bo vrednost natisnjena kot niz 'GeeksforGeeks'.

razred GFG (objekt):
val = deskriptor ()
g = GFG ()
g.val = "Geeks"
tiskanje (g.val)

Ko poskusite zagnati to kodo, boste dobili naslednji izhod:

GeeksforGeeks

Namen deskriptorjev

Opišimo razred z imenom "dom" s tremi značilnostmi, in sicer: lokacijo, območjem in ceno. Lahko uporabite funkcijo __v__() za inicializacijo atributov razreda.

razred domov:

def __init __ (self, loc, area, price):

Nato lahko uporabite funkcijo __str __ (), ki lahko vrne rezultat treh atributov, ki jih lahko predate razredu pri gradnji predmeta. Funkcija __str __ () bo vrnila niz.

Ko zaženete to kodo, se prikaže na videz pravilen izhod.

Zdaj poskusimo spremeniti ceno stanovanja na negativno vrednost, kot je prikazano spodaj, in izvedite kodo.

Spremembe sploh niso, razen negativnega predznaka, kot je prikazano v izhodu. Počakaj! Tukaj je nekaj narobe, kajne? Kako to, da je cena stanovanja negativna. Python to omogoča, ker je Python vsestransko razvojno okolje, ki posebej ne omogoča preverjanja tipa.

Inicializiramo stavek 'if' v __v__() funkcija, da sproži izjemo, če je vrednost ali cena manjša od nič.

Zdaj lahko opazite, da deluje dobro in če je cena nižja od nič, koda generira napako vrednosti.

Kot lahko razumemo, __v_() funkcija je konstruktor in se prikliče samo enkrat, ko naredite objekt razreda. Zato pozneje preverjanje vrste po meri ne bi uspelo. Python ponuja deskriptorje, ki so specializirani za pomoč pri odpravi vseh zgoraj navedenih pomislekov. Zdaj pa začnimo uporabljati deskriptorje v istem primeru, da ga dobro razumemo.

Razred deskriptorja ' __v_() funkcija ima lokalno spremenljivko __cena pri 0. Na začetku dvojno podčrtaje pomeni, da je parameter zaseben. Uporablja se za razlikovanje parametra cene razreda Descriptor od domačega razreda.

The __get __ () metoda vrne ceno. Primerek atributa vsebuje h1, ki je primerek deskriptorja. Lastnik atributa se sklicuje na ime razreda 'dom' in vrne ceno.

Funkcija __set __ () ima atribut primer ki vsebuje h1 in vrednost, ki jo je treba dodeliti. Ček se uporablja za potrditev vrednosti. Če je vrednost celo število, bo natisnjena, sicer pa koda z vrnitvijo izjeme Type Error. Če je vrednost pod ničlo, bo v kodo vržena izjema Napaka vrednosti.

The __izbriši __ () funkcija se izvede, ko je atribut parametra odstranjen iz predmeta.

Domači razred ostaja enak, čeprav primerek cena razreda Descriptor (). V __v_() funkcija, dodajte ceno atributa na ceno primerka in ta bo poklical __set_ () funkcijo.

Med izvajanjem te kode se vam prikaže napaka vrednosti, ker cena nikoli ne more biti enaka.

Zdaj poskusite izvršiti kodo z nizno vrednostjo.

Izpisala bo izjemo napake tipa.

Obstoječa vrednost primerka je nadomeščena pri oblikovanju novega primerka, ker so deskriptorji povezani z razredom in ne primerkom. Oglejte si spodaj:

Prva vrednost je bila preglašena z drugo.

Zaključek

S pomočjo te vadnice lahko razumemo, zakaj so deskriptorji iz Pythona postali tako zanimiva tema in v katere scenarije uporabe jih lahko dodate.

Namestite najnovejši Dolphin Emulator za Gamecube & Wii v Linux
Dolphin Emulator vam omogoča igranje izbranih iger Gamecube in Wii na osebnih računalnikih Linux (PC). Dolphin Emulator je prosto dostopen in odprtok...
Kako uporabljati GameConqueror Cheat Engine v Linuxu
Članek zajema vodnik o uporabi varalnice GameConqueror v Linuxu. Številni uporabniki, ki igrajo igre v sistemu Windows, pogosto uporabljajo aplikacijo...
Najboljši emulatorji igralne konzole za Linux
V tem članku bo navedena priljubljena programska oprema za emulacijo igralne konzole, ki je na voljo za Linux. Emulacija je sloj združljivosti program...