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.