Pitone

Tutorial sui descrittori di Python

Tutorial sui descrittori di Python
Una tecnica utile per scrivere codice generico che potrebbe essere riutilizzato tra le classi è supportata dai descrittori Python, o più comunemente noti come descrittori. Possono sembrare vicini al concetto 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 del linguaggio. Se hai mai pensato che i descrittori Python con poche implementazioni funzionali siano un argomento avanzato, allora questo tutorial è la piattaforma definitiva per farti capire questa potente funzionalità.

Metodi descrittori

Per dirlo chiaramente, una classe che implementa __ottenere_(), __impostato()_, o __Elimina()_ la funzione di un protocollo descrittore per un oggetto è classificata come "Descrittore". Per governare i parametri delle varie classi che usano l'oggetto come riferimento, vengono realizzati descrittori Python. Ecco tre metodi specificati, che verranno utilizzati nei descrittori:

__ottenere__(): Quando si tenta di estrarre i dati, il __ottenere__() viene chiamato l'attributo e qualunque cosa fornisca è ciò che verrebbe fornito al codice che richiede il valore di una variabile. È classificato come descrittore non di dati ed è solo leggibile.

__impostato__(): La funzione __impostato__() viene chiamato per regolare i valori dei parametri e questa funzione non restituisce nulla. È noto come descrittore di dati che non è solo leggibile ma anche scrivibile.

__Elimina__(): Ogni volta che il parametro viene rimosso da un oggetto, il __Elimina__() la funzione è chiamata. È noto come descrittore di dati che non è solo leggibile ma anche scrivibile.

Devi solo applicare il protocollo del descrittore se stai usando i descrittori Python nel tuo script your. Le funzioni più significative del protocollo sono ottenere() e impostato() avendo la successiva firma.

__get__(self, obj, type=Nessuno) -> oggetto
__set__(self, obj, value) -> Nessuno

se stesso è l'istanza del descrittore.
obj è un'istanza dell'oggetto a cui è connesso il tuo descrittore.
genere è il tipo di un oggetto.

Esempio:

Qui abbiamo definito due classi. Nella classe Descriptor, abbiamo definito i metodi del descrittore. Nel ottenere(), il self è l'istanza per il descrittore 'val', otterrà un valore 'Geeks' e lo memorizzerà. Quindi creerà una stringa con 'for' allegato tra l'attributo fornito. Descrittore di classe (oggetto):

def __get__(self, obj, objtype):
restituire "per".formato (auto.val, sé.val)

Restituirà quindi il valore al metodo set(). Questa funzione controlla quindi il valore, che si tratti di una stringa o meno or. Nel caso in cui il valore sia una stringa, verrà salvato in un attributo denominato 'val'. Se il valore non è una stringa, genererà un'eccezione.

def __set__(self, obj, val):
if isinstance(val, str):
se stesso.val = val
altro:
raise TypeError ("Il nome dovrebbe essere una stringa")

Successivamente, il valore verrà stampato come una stringa "GeeksforGeeks".

classe GFG(oggetto):
val = Descrittore()
g = GFG()
g.val = "Geek"
print(g.val)

Quando provi a eseguire questo codice, otterrai il seguente output:

GeeksforGeeks

Scopo dei descrittori

Descriviamo una classe denominata 'casa' con tre caratteristiche, ovvero: loc, area e prezzo. Puoi usare la funzione __dentro__() per inizializzare gli attributi della classe.

classe a casa:

def __init__(self,loc,area,prezzo):

Quindi, puoi usare la funzione __str__(), che potrebbe restituire il risultato dei tre attributi che potresti passare alla classe durante la creazione dell'elemento. La funzione __str__() restituirà la stringa.

Quando esegui questo codice, verrà visualizzato l'output apparentemente corretto correct.

Ora proviamo a cambiare il prezzo della casa con un valore negativo, come sotto, ed eseguiamo il codice.

Non c'è alcun cambiamento, ad eccezione del segno negativo, come mostrato nell'output. Un attimo! Qualcosa non 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 sollevare 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 e viene invocata solo una volta quando crei un oggetto di classe. Pertanto, in seguito, il controllo del tipo personalizzato fallirebbe. Python fornisce descrittori specializzati nell'aiutare a risolvere tutti i problemi di cui sopra. Ora, iniziamo a usare i descrittori nello stesso esempio per capirlo bene.

La classe dei descrittori' __dentro_() la funzione ha una variabile locale __price a 0. All'inizio, un doppio trattino basso implica che il parametro è privato. Viene utilizzato per differenziare il parametro prezzo classe Descrittore dalla classe casa home.

Il __ottenere__() il metodo restituirà il prezzo. L'istanza dell'attributo contiene h1, che è un'istanza del descrittore. Il proprietario dell'attributo si riferisce al nome della classe "casa" e restituisce il prezzo.

La funzione __impostato__() ha un attributo esempio che contiene h1 e un valore da assegnare. Il segno di spunta viene utilizzato per confermare il valore. Se il valore è un intero, verrà stampato, altrimenti il ​​codice genera un'eccezione Type Error Error. Se il valore è inferiore a zero, l'eccezione Value Error verrà generata nel codice.

Il __Elimina__() la funzione viene eseguita quando l'attributo del parametro viene rimosso da un oggetto.

La classe principale rimane la stessa, sebbene l'istanza prezzo della classe Descriptor() viene aggiunto. Nel __dentro_() funzione, aggiungi l'attributo price al prezzo dell'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.

Genererà un'eccezione di errore di tipo.

Il valore dell'istanza esistente viene sovrascritto alla formazione di una nuova istanza poiché i descrittori sono relativi alla classe e non all'istanza. Dai un'occhiata qui sotto:

Il primo valore è stato sovrascritto con il secondo.

Conclusione

Possiamo capire perché i descrittori di Python sono diventati un argomento così affascinante e a che tipo di scenari di utilizzo puoi aggiungerli seguendo questo tutorial.

Le 5 migliori carte di acquisizione del gioco
Abbiamo tutti visto e amato i giochi in streaming su YouTube. PewDiePie, Jakesepticye e Markiplier sono solo alcuni dei migliori giocatori che hanno g...
Come sviluppare un gioco su Linux
Un decennio fa, non molti utenti Linux avrebbero previsto che il loro sistema operativo preferito un giorno sarebbe diventato una piattaforma di gioco...
Porte open source di motori di gioco commerciali
Ricreazioni del motore di gioco gratuite, open source e multipiattaforma possono essere utilizzate per riprodurre titoli di giochi vecchi e abbastanza...