Tutorial dei descrittori di Python

Tutorial dei descrittori di Python
Una tecnica utile per scrivere codice generico che potrebbe essere riutilizzato tra le classi è supportata da descrittori di Python, o più comunemente noti come descrittori. Possono sembrare vicini alla nozione di eredità, ma non lo sono. Questa è una tecnica diretta per acquisire l'accesso agli attributi con una natura vincolante. I descrittori sono una funzione di base di Python che governa gran parte della stregoneria, nascosta sotto la copertura della lingua. Se hai mai sentito che i descrittori di Python con poche implementazioni funzionali sono un argomento avanzato, allora questo tutorial è la piattaforma finale per farti capire questa potente funzionalità.

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.