Beskrivelsesmetoder
At sige det klart, en klasse, der gennemføres __få_(), __sæt()_, eller __delete () _ funktion af en deskriptorprotokol for et objekt er klassificeret som en "Descriptor". For at styre parametrene for forskellige klasser, der bruger objektet som reference, laves Python-deskriptorer. Her er tre specificerede metoder, som vil blive brugt i deskriptorer:
__få__(): Når du prøver at udtrække data, vises __få__() attribut kaldes, og uanset hvad det giver, er hvad der ville blive leveret til koden, der krævede værdien af en variabel. Det er kategoriseret som en ikke-data-deskriptor og kan kun læses.
__sæt__(): Funktionen __sæt__() kaldes til at justere parameterværdierne, og intet returneres til dig med denne funktion. Det er kendt som en databeskrivelse, der ikke kun er læsbar, men også skrivbar.
__slet __ (): Når parameteren fjernes fra et objekt, vises __slet __ () funktion kaldes. Det er kendt som en databeskrivelse, der ikke kun er læsbar, men også skrivbar.
Du skal kun håndhæve deskriptorprotokollen, hvis du bruger Python-deskriptorer i dit script. De vigtigste funktioner i protokollen er få() og sæt() med den efterfølgende underskrift.
__get __ (selv, obj, type = Ingen) -> objekt
__set __ (selv, obj, værdi) -> Ingen
selv er forekomsten af deskriptoren.
obj er en forekomst af det objekt, som din deskriptor er knyttet til.
type er typen af et objekt.
Eksempel:
Her har vi defineret to klasser. I klassen Descriptor har vi definerede deskriptormetoder. I få() metode, selvet er forekomsten af deskriptoren 'val', den får en værdi 'Geeks' og gemmer den. Derefter oprettes en streng med 'for' knyttet mellem den angivne attribut. klasse deskriptor (objekt):
def __get __ (selv, obj, objtype):
returner " for ".format (selv.val, selv.val)
Derefter returnerer værdien til metoden set (). Denne funktion kontrollerer derefter for værdien, uanset om den er en streng eller ej. Hvis værdien er en streng, gemmes den i en attribut med navnet 'val'. Hvis værdien ikke er en streng, kaster den en undtagelse.
def __set __ (selv, obj, val):
hvis isinstance (val, str):
selv.val = val
andet:
hæve TypeError ("Navn skal være streng")
Herefter bliver værdien udskrevet som en streng 'GeeksforGeeks'.
klasse GFG (objekt):
val = deskriptor ()
g = GFG ()
g.val = “Geeks”
udskrive (g.val)
Når du prøver at køre denne kode, får du følgende output:
GeeksforGeeks
Formålet med deskriptorer
Lad os beskrive en klasse med navnet 'hjem' med tre karakteristika, nemlig: lokalitet, område og pris. Du kan bruge funktionen __i det__() at initialisere klasseattributterne.
klassehjem:
def __init __ (selv, lokal, område, pris):
Derefter kan du bruge funktionen __str __ (), som kan returnere resultatet af de tre attributter, som du muligvis videregiver til klassen, når du bygger varen. Funktionen __str __ () returnerer strengen.
Når du udfører denne kode, viser den tilsyneladende korrekte output.
Lad os nu prøve at ændre prisen på hjemmet til en negativ værdi, som nedenfor, og udføre koden.
Der er slet ingen ændring undtagen det negative tegn som vist i output. Hæng i! Noget er væk her, ikke sandt? Hvorfor er prisen på et hjem negativ. Python tillader det, fordi Python er et alsidigt udviklingsmiljø, der specifikt ikke tillader typekontrol.
Lad os initialisere en 'hvis' erklæring i __i det__() funktion til at hæve en undtagelse, hvis værdien eller prisen er mindre end nul.
Fra nu af kan du bemærke, at det fungerer godt, og hvis prisen er mindre end nul, genererer koden en værdifejl.
Som vi måske forstår, __i det_() funktionen er en konstruktør og påkaldes kun en gang, når du laver et klasseobjekt. Derfor senere mislykkedes tilpasset typekontrol. Python leverer deskriptorer, der er specialiserede i at hjælpe med at løse alle ovenstående bekymringer. Lad os nu begynde at bruge deskriptorer i det samme eksempel for at forstå det godt.
Descriptor-klassen ' __i det_() funktionen har en lokal variabel __pris ved 0. I starten af det betyder en dobbelt understregning, at parameteren er privat. Det bruges til at differentiere Descriptor-klassens prisparameter fra hjemmeklassen.
Det __få__() metode returnerer prisen. Attributforekomsten indeholder h1, som er en deskriptorforekomst. Attributtejer refererer til navnet på klassen 'hjem' og returnerer prisen.
Funktionen __sæt__() har en attribut eksempel der indeholder h1 og en værdi, der skal tildeles. Kontrollen bruges til at bekræfte værdien. Hvis værdien er et heltal, vil den blive udskrevet, ellers koden med en undtagelse for typefejl. Hvis værdien er under nul, kastes værdifejlundtagelsen i koden.
Det __slet __ () funktionen udføres, når parameterattributten fjernes fra et objekt.
Hjemmeklassen forbliver den samme, selvom den forekommer pris af klassen Descriptor () tilføjes. I __i det_() funktion, tilføj prisattributten til instansprisen, og den kalder __sæt_() fungere.
Mens du kører denne kode, giver den dig en værdifejl, fordi prisen aldrig kan være nul.
Prøv nu at udføre koden med en strengværdi.
Det kaster en undtagelse fra typefejl.
Den eksisterende forekomstværdi tilsidesættes ved dannelsen af en ny forekomst, da beskrivelserne er relateret til klassen og ikke forekomsten. Se nedenfor:
Den første værdi er blevet tilsidesat med den anden.
Konklusion
Vi kan forstå, hvorfor deskriptorer fra Python er blevet et så fascinerende emne, og hvilken slags brugsscenarier du kan tilføje dem til ved at gennemgå denne vejledning.