Python Descriptors Tutorial

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

Beskrivelsesmetoder

Å oppgi det tydelig, en klasse som implementerer __få_(), __sett()_, eller __delete () _ Funksjon av en deskriptorprotokoll for et objekt klassifiseres som en "deskriptor". For å styre parametrene til forskjellige klasser som bruker objektet som referanse, blir Python -beskrivelser laget. Her er tre spesifiserte metoder, som vil bli brukt i beskrivelser:

__få__(): Når du prøver å trekke ut dataene, __få__() Attributt kalles, og hva det gir er det som vil bli gitt til koden som krever verdien av en variabel. Den er kategorisert som en ikke-databeskrivelse 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å skrevet.

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

Du trenger bare å håndheve deskriptorprotokollen hvis du bruker Python -beskrivelser i skriptet. Protokollens ytterste funksjoner er få() og sett() Å ha den påfølgende signaturen.

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

selv- er forekomsten av beskrivelsen.
obj er en forekomst av objektet som beskrivelsen din er tilkoblet.
type er typen et objekt.

Eksempel:

Her har vi definert to klasser. I klassebeskrivelsen har vi definert deskriptormetoder. I få() Metode, selvet er forekomsten for beskrivelsen 'val', det vil få en verdi 'geeks' og lagrer den. Da vil den lage en streng med 'for' festet mellom det medfølgende attributtet. Klassebeskrivelse (objekt):

def __get __ (selv, obj, objype):
returner “ for ”.Format (selv.Val, selv.val)

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

def __set __ (selv, obj, val):
Hvis IsInstance (Val, STR):
selv-.Val = Val
ellers:
Hev TypeError (“Navn skal være streng”)

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

Klasse GFG (objekt):
Val = Descriptor ()
g = gfg ()
g.Val = “Geeks”
trykk (g.val)

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

Geeksforgeeks

Formålet med beskrivelser

La oss beskrive en klasse som heter 'Home' med tre egenskaper, nemlig: LOC, Area and Price. Du kan bruke funksjonen __i det__() for å initialisere klasseattributtene.

Klassehjem:

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

Deretter kan du bruke funksjonen __str __ (), som kan returnere resultatet av de tre attributtene du kan sende til klassen når du bygger varen. __Str __ () -funksjonen vil returnere strengen.

Når du utfører denne koden, vil den vise 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 utgangen. Vent litt! Noe er her, er det ikke? 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 "hvis" uttalelse i __i det__() funksjon for å øke et unntak hvis verdien eller prisen er mindre enn null.

Per nå kan du kanskje legge merke til at den fungerer bra, og hvis prisen er mindre enn null, genererer koden en verdifeil.

Som vi kanskje forstår, __i det_() Funksjon er en konstruktør, og påberopes bare en gang når du lager et klasseobjekt. Derfor, senere, vil tilpasset typekontroll mislykkes. Python gir beskrivelser som spesialiserer seg på å hjelpe til med å fikse alle de ovennevnte bekymringene. La oss nå begynne å bruke beskrivelser i samme eksempel for å forstå det godt.

Deskriptorklassen ' __i det_() Funksjonen har en lokal variabel __pris ved 0. Ved starten av det innebærer en dobbel understrekning at parameteren er privat. Det brukes til å skille beskrivelsesklasseprisparameteren 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 en attributt forekomst som inneholder H1, og en verdi som skal tildeles. Sjekk brukes til å bekrefte verdien. Hvis verdien er et heltall, vil den bli skrevet ut, ellers, koden med å kaste et feilfeil unntak. Hvis verdien er under null, vil unntaket for verdifeil kastes i koden.

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

Hjemmeklassen forblir den samme, selv om forekomsten pris av deskriptor () -klassen er lagt til. I __i det_() funksjon, legg til 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 feilsøkning av typefeil.

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

Den første verdien har blitt overstyrt med den andre.

Konklusjon

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