Metodi descrittori
Per dichiararlo chiaramente, una classe che implementa __Ottenere_(), __impostato()_, O __eliminare()_ La funzione di un protocollo descrittore per un oggetto è classificato come un "descrittore". Per governare i parametri di varie classi che usano l'oggetto come riferimento, vengono realizzati descrittori di Python. Ecco tre metodi specificati, che verranno utilizzati nei descrittori:
__Ottenere__(): Quando si tenta di estrarre i dati, il __Ottenere__() L'attributo viene chiamato e qualunque cosa fornisca è ciò che verrebbe fornito al codice che richiede il valore di una variabile. È classificato come un descrittore non data ed è solo leggibile.
__impostato__(): La funzione __impostato__() è chiamato per regolare i valori dei parametri e nulla ti viene restituito da questa funzione. È noto come un descrittore di dati che non è solo leggibile ma anche scrivibile.
__eliminare__(): Ogni volta che il parametro viene rimosso da un oggetto, il __eliminare__() la funzione è chiamata. È noto come un descrittore di dati che non è solo leggibile ma anche scrivibile.
Devi solo applicare il protocollo del descrittore se stai usando i descrittori di Python nel tuo script. Le funzioni più significative del protocollo sono Ottenere() E impostato() Avere la firma successiva.
__get __ (self, obj, type = non) -> oggetto
__set __ (self, obj, valore) -> Nessuno
se stesso è l'istanza del descrittore.
obj è un'istanza dell'oggetto a cui è connesso il descrittore.
tipo è il tipo di oggetto.
Esempio:
Qui abbiamo definito due classi. Nel descrittore della classe, abbiamo definito i metodi del descrittore. Nel Ottenere() metodo, il sé è l'istanza per il descrittore "val", otterrà un valore "geek" e lo memorizza. Quindi farà una stringa con "per" allegato tra l'attributo fornito. Descrittore di classe (oggetto):
def __get __ (self, obj, objtype):
return " per ".formato (sé.Val, Self.Val)
Restituirà quindi il valore al metodo set (). Questa funzione quindi controlla il valore, che si tratti di una stringa o no. Nel caso in cui il valore sia una stringa, verrà salvato in un attributo chiamato 'Val'. Se il valore non è una stringa, lancerà un'eccezione.
def __set __ (self, obj, val):
Se Isinstance (Val, STR):
se stesso.Val = Val
altro:
solleva typeerror ("il nome dovrebbe essere stringa")
Successivamente, il valore verrà stampato come una stringa "GeeksForgeeks".
Classe GFG (oggetto):
val = descrittore ()
g = gfg ()
G.Val = "Geeks"
Stampa (g.Val)
Quando provi a eseguire questo codice, otterrai il seguente output:
Geeksforgeeks
Scopo dei descrittori
Descriviamo una classe chiamata "Home" con tre caratteristiche, vale a dire: loc, area e prezzo. È possibile utilizzare la funzione __dentro__() per inizializzare gli attributi di classe.
Casa di classe:
def __init __ (self, loc, area, prezzo):
Quindi, è possibile utilizzare la funzione __str __ (), che potrebbe restituire il risultato dei tre attributi che potresti passare alla classe quando si crea l'articolo. La funzione __Str __ () restituirà la stringa.
Quando si esegue questo codice, visualizzerà l'output apparentemente corretto.
Ora proviamo a modificare il prezzo della casa in un valore negativo, come di seguito, ed eseguiamo il codice.
Non vi è alcun cambiamento, tranne il segno negativo, come mostrato nell'output. Aspettare! Qualcosa va qui, non è vero? Come mai il prezzo di una casa è negativo. Python lo consente perché Python è un ambiente di sviluppo versatile che in particolare non consente il controllo del tipo.
Inizializza un'istruzione "if" in __dentro__() funzione per aumentare un'eccezione se il valore o il prezzo è inferiore a zero.
A partire da ora, potresti notare che funziona bene e se il prezzo è inferiore a zero, il codice genera un errore di valore.
Come potremmo capire, il __dentro_() La funzione è un costruttore ed è invocata solo una volta quando si crea un oggetto di classe. Pertanto, in seguito, il controllo di tipo personalizzato fallirebbe. Python fornisce descrittori specializzati nell'aiutare a riparare tutte le preoccupazioni di cui sopra. Ora, iniziamo a usare i descrittori nello stesso esempio per capirlo bene.
La classe descrittore ' __dentro_() La funzione ha una variabile locale __price a 0. All'inizio di esso, un doppio sottocore implica che il parametro è privato. Viene utilizzato per differenziare il parametro del prezzo della classe descrittore dalla classe di casa.
IL __Ottenere__() Il metodo restituirà il prezzo. L'istanza di attributo contiene H1, che è un'istanza del descrittore. Il proprietario dell'attributo si riferisce al nome della classe "Home" e restituisce il prezzo.
La funzione __impostato__() ha un attributo esempio che contiene H1 e un valore da assegnare. Controllo viene utilizzato per confermare il valore. Se il valore è un numero intero, verrà stampato, altrimenti il codice con lancio di un'eccezione di errore di tipo. Se il valore è inferiore allo zero, l'eccezione dell'errore del valore verrà lanciata nel codice.
IL __eliminare__() La funzione viene eseguita quando l'attributo parametro viene rimosso da un oggetto.
La lezione di casa rimane la stessa, anche se l'istanza prezzo della classe descrittore () viene aggiunta. Nel __dentro_() funzione, aggiungi l'attributo del prezzo al prezzo di istanza e chiamerà il __impostato_() funzione.
Durante l'esecuzione di questo codice, ti darà un errore di valore perché il prezzo non può mai essere zero.
Ora prova a eseguire il codice con un valore stringa.
Lancerà un'eccezione di errore di tipo.
Il valore di istanza esistente viene annullato sulla formazione di una nuova istanza poiché i descrittori sono correlati alla classe e non all'istanza. Dai un'occhiata qui sotto:
Il primo valore è stato annullato con il secondo.
Conclusione
Possiamo capire perché i descrittori di Python sono diventati un argomento così affascinante e a quale tipo di scenari di utilizzo puoi aggiungerli passando attraverso questo tutorial.