Python

Python Descriptors Tutorial

Python Descriptors Tutorial
En nyttig teknikk for å skrive generisk kode som kan brukes på nytt mellom klassene støttes av Python-deskriptorer, eller mer kjent som deskriptorer. De høres kanskje nær forestillingen om arv ut, men det er de ikke. Dette er en direkte teknikk for å fange tilgang til attributter med en bindende karakter. Beskrivelser er en grunnleggende funksjon av Python som styrer mye av trolldommen, skjult under dekning av språket. Hvis du noen gang har følt at Python-deskriptorer med lite funksjonelle implementeringer er et avansert emne, så er denne opplæringen den ultimate plattformen for å få deg til å forstå denne kraftige funksjonen.

Beskrivelsesmetoder

For å si det tydelig, en klasse som gjennomføres __få_(), __sett()_, eller __delete () _ funksjonen til en deskriptorprotokoll for et objekt er klassifisert som en "Descriptor". For å styre parametrene til forskjellige klasser som bruker objektet som referanse, lages Python-deskriptorer. Her er tre spesifiserte metoder, som vil bli brukt i beskrivelser:

__få__(): Når du prøver å trekke ut dataene, vises __få__() attributt kalles, og hva det gir er hva som vil bli gitt til koden som krever verdien av en variabel. Den er kategorisert som en ikke-data-deskriptor og er bare lesbar.

__sett__(): Funksjonen __sett__() kalles for å justere parameterverdiene, og ingenting blir returnert til deg av denne funksjonen. Det er kjent som en databeskrivelse som ikke bare er lesbar, men også skrivbar.

__slett __ (): Når parameteren fjernes fra et objekt, blir __slett __ () funksjon kalles. Det er kjent som en databeskrivelse som ikke bare er lesbar, men også skrivbar.

Du trenger bare å håndheve deskriptor-protokollen hvis du bruker Python-deskriptorer i skriptet. De største funksjonene til protokollen er få() og sett() har den påfølgende signaturen.

__get __ (selv, obj, type = Ingen) -> objekt
__sett __ (selv, obj, verdi) -> Ingen

selv- er forekomsten av beskriveren.
obj er en forekomst av objektet som deskriptoren din er koblet til.
type er typen objekt.

Eksempel:

Her har vi definert to klasser. I klassen Descriptor har vi definert deskriptor metoder. I få() -metoden, er selvet forekomsten av beskriveren 'val', den får verdien 'Geeks' og lagrer den. Deretter vil den lage en streng med 'for' festet mellom det angitte attributtet. klasse deskriptor (objekt):

def __get __ (selv, obj, objtype):
returner “ for ”.format (selv.val, selv.val)

Den vil da returnere verdien til set () -metoden. Denne funksjonen sjekker deretter verdien, enten det er en streng eller ikke. I tilfelle verdien er en streng, blir den lagret i et attributt som heter 'val'. Hvis verdien ikke er en streng, vil den kaste et unntak.

def __sett __ (selv, obj, val):
if isinstance (val, str):
selv-.val = val
ellers:
heve TypeError (“Navnet skal være streng”)

Etter det vil verdien bli skrevet ut som en streng 'GeeksforGeeks'.

klasse GFG (objekt):
val = deskriptor ()
g = GFG ()
g.val = “Geeks”
skrive ut (g.val)

Når du prøver å kjøre denne koden, får du følgende utdata:

GeeksforGeeks

Formålet med beskrivere

La oss beskrive en klasse som heter 'hjem' med tre egenskaper, nemlig: lok, område og pris. Du kan bruke funksjonen __i det__() for å initialisere klasseattributtene.

klasse hjemme:

def __init __ (selv, lokal, område, pris):

Deretter kan du bruke funksjonen __str __ (), som kan returnere resultatet av de tre attributtene du kan overføre til klassen når du bygger varen. Funksjonen __str __ () returnerer strengen.

Når du utfører denne koden, viser den tilsynelatende riktige utgangen.

La oss nå prøve å endre prisen på hjemmet til en negativ verdi, som nedenfor, og utføre koden.

Det er ingen endring i det hele tatt, bortsett fra det negative tegnet, som vist i utdataene. Vent litt! Noe er borte her, ikke sant? Hvorfor er prisen på et hjem negativ. Python tillater det fordi Python er et allsidig utviklingsmiljø som spesifikt ikke tillater typekontroll.

La oss initialisere en 'if' uttalelse i __i det__() funksjon for å heve et unntak hvis verdien eller prisen er mindre enn null.

Fra nå av kan du merke at det fungerer bra, og hvis prisen er mindre enn null, genererer koden en verdifeil.

Som vi kanskje forstår, er __i det_() funksjonen er en konstruktør, og blir bare påkalt en gang når du lager et klasseobjekt. Derfor vil tilpasset typekontroll senere mislykkes. Python tilbyr beskrivere som er spesialister på å løse alle de ovennevnte bekymringene. La oss nå begynne å bruke beskrivere i det samme eksemplet for å forstå det godt.

Descriptor-klassen ' __i det_() funksjonen har en lokal variabel __pris på 0. Ved starten av det innebærer et dobbelt understreking at parameteren er privat. Den brukes til å skille prisparameteren Descriptor-klasse fra hjemmeklassen.

De __få__() metoden vil returnere prisen. Attributtforekomsten inneholder h1, som er en deskriptorforekomst. Attributt eier refererer til navnet på klassen 'hjem' og returnerer prisen.

Funksjonen __sett__() har et attributt forekomst som inneholder h1, og en verdi som skal tildeles. Kontroll brukes for å bekrefte verdien. Hvis verdien er et heltall, vil den skrives ut, ellers vil koden med unntak for typefeil kaste. Hvis verdien er under null, vil Verdifeil-unntaket kastes inn i koden.

De __slett __ () funksjonen utføres når parameterattributtet fjernes fra et objekt.

Hjemmeklassen forblir den samme, selv om forekomsten pris av Descriptor () -klassen er lagt til. I __i det_() funksjon, legg prisattributtet til forekomstprisen, og den vil kalle __sett_() funksjon.

Mens du kjører denne koden, vil den gi deg en verdifeil fordi prisen aldri kan være null.

Prøv nå å utføre koden med en strengverdi.

Det vil kaste et typefeil unntak.

Den eksisterende forekomstverdien overstyres ved dannelsen av en ny forekomst siden beskrivelsene er relatert til klassen og ikke forekomsten. Ta en titt på nedenfor:

Den første verdien er overstyrt med den andre.

Konklusjon

Vi kan forstå hvorfor beskrivere fra Python har blitt et så fascinerende tema og hva slags bruksscenarier du kan legge dem til ved å gå gjennom denne veiledningen.

Kamp for Wesnoth 1.1. 3.6 Utvikling utgitt
Kamp for Wesnoth 1.1. 3.6 utgitt i forrige måned, er den sjette utgivelsen i 1.1. 3.x-serien, og den leverer en rekke forbedringer, spesielt til bruke...
Slik installerer du League Of Legends på Ubuntu 14.04
Hvis du er fan av League of Legends, er dette en mulighet for deg å prøvekjør League of Legends. Merk at LOL støttes på PlayOnLinux hvis du er en linu...
Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...