Descrittore in Python

| | | | | | | | | | |

Protocollo descrittore:
In altri linguaggi di programmazione, i descrittori sono chiamati setter e getter, dove le funzioni pubbliche vengono utilizzate per ottenere e impostare una variabile privata. Python non ha il concetto di variabili private e il protocollo del descrittore può essere considerato un modo Pythonico per ottenere qualcosa del genere. Descrittori — è un nuovo modo di implementare le classi in Python e non ha bisogno di ereditare nulla da un particolare oggetto. Per implementare facilmente i descrittori in Python, dobbiamo utilizzare almeno uno dei metodi sopra definiti. Si noti che l`istanza seguente restituisce l`oggetto a cui è stato eseguito l`accesso dall`attributo e che il proprietario è la classe in cui l`handle è stato assegnato come attributo. Ci sono tre protocolli nel descrittore Python per setter, getter e un metodo delete.

  • gfg .__ get __ (self, obj, type = None) : Questo attributo viene chiamato quando vuoi ottenere le informazioni (value = obj.attr) e qualunque cosa restituisca è — questo è ciò che verrà passato al codice che ha richiesto il valore dell`attributo.
  • gfg .__ set __ (self, obj, value) : questo metodo viene chiamato per impostare i valori degli attributi ‚Äã‚Äã(obj .attr = &# 39; valore ') e non ti restituirà nulla.
  • gfg .__ delete __ (self, obj) : questo metodo viene chiamato quando un attributo viene rimosso da un oggetto (del obj.attr)

Richiamo del descrittore:
I descrittori vengono richiamati automaticamente quando viene ricevuta una chiamata per il metodo set() o il get() metodo. Ad esempio, obj.gfg cerca gfg nel dizionario obj . Se gfg definisce un metodo __get __() , allora gfg .__ get __ (obj) . Può anche essere chiamato direttamente dal nome del metodo, cioè gfg .__ get __ (obj) .


# Mostra programma Python
# come chiamare il descrittore

def __ getattribute __ ( self , chiave):

v = oggetto .__ getattribute __ ( self , chiave)

if hasattr ( v, `__get__` ):

return v .__ get __ ( Nessuno , self )

return v

Punti importanti da ricordare:

  • I descrittori sono chiamati dal metodo __getattribute __() .
  • L`override di __getattribute__ () impedisce le chiamate automatiche al descrittore.
  • oggetto .__ getattribute __() e tipo .__ getattribute __() varie chiamate a __get __ ( ) .
  • I descrittori di dati sovrascrivono sempre i dizionari di istanza.
  • I descrittori non di dati possono essere sostituiti da dizionari di istanza.

Un esempio di descrittore:
In questo esempio, un descrittore di dati di solito imposta e restituisce valori ‚Äã‚Äãe stampa un messaggio che registra il loro accesso.
Codice 1:


classe Descrittore ( oggetto ):

def __ init __ ( , nome = ` `):

self . nome = nome


def __ get __ ( self , obj, objtype): >

return " {} for {} "< /codice> . formato ( self .name, self .name)

def __ set __ ( self , obj, name):

if istanza (nome, str ):

self . nome = nome

else :

raise TypeError ( " Il nome deve essere una stringa " )


classe GFG ( oggetto ):

nome = Descrittore ()

g = GFG()

g.name = "Geek"

print (g.name)

Esci:

Python.Engineering

Codice 2:


< tbody>

class Descrittore ( oggetto ):


def __ init __ ( self , nome = ` `):

self . nome = nome


def __ get __ ( self , obj, objtype): >

return "{} for {}" . formato ( self .name, self .name)


def __ set __ ( self , obj, name ):

if istanza ( nome, str ):

self . name = name

else :

raise TypeError ( "Il nome dovrebbe essere una stringa" )


classe GFG ( oggetto ):

nome = Descrittore ()


g = GFG ()

g.name = "Computer"

print ( g.name)

Esci:

 ComputerforComputer 

Crea un handle usando la proprietà ():
proprietà () , è facile creare un descrittore utilizzabile per qualsiasi attributo. Sintassi per la creazione della proprietà property()

 (fget = None, fset = None, fdel = None, doc = None) 

< bordo della tabella = "0" cellpadding = "0" cellspacing = "0">

# Programma Python per spiegare la proprietà ( ) funzione


# Classe alfabetica

classe Alfabeto:

def __ init __ ( self , valore):

self ._ valore = valore


# ottenere valori ‚Äã‚Äã

def getValue ( se lf ):

print ( `Ottieni valore` )

return self ._ value


# valori di installazione ‚Äã‚Äã

def setValue ( self , valore):

print ( `Impostazione del valore su` + valore)

self ._ valore = valore


# remo ve valori ‚Äã‚Äã

def delValue ( self ):

print ( `Eliminazione valore` )

del self ._ value


valore = proprietà (getValue, setValue, delValue,)


# passa il valore

x = Alfabeto ( `GeeksforGeeks` )

print (x.value)


x.value = `GfG`

del x.value

Esci:

 Ottenere il valore Python.Engineering Impostare il valore su GfG Eliminare il valore 

Generazione di un descrittore usando i metodi di classe:
In questo abbiamo creato Prendiamo la classe e sovrascriviamo uno qualsiasi dei metodi del descrittore __set__ , __ get__ e __delete__ . Questo metodo viene utilizzato quando è richiesto lo stesso descrittore per molte classi e attributi diversi, ad esempio per il controllo del tipo.


class Descrittore ( oggetto ):

def < codice classe ="plain"> __ init__ ( self , nome = ` `):

self .name = nome

def __ get __ ( self , obj, objtype):

return " {} for {} " . formato ( self .name, self .name)


def __ set __ ( self , obj, name ):

if istanza (nome, str ):

self . nome = nome

else :

raise TypeError ( "Il nome dovrebbe essere una stringa" )


classe GFG ( oggetto ):

nome = Descrittore ()


g = GFG ( )

g.name = "Geek "

print (g.name)

< /codice>

Output:

 Python.Engineering 

Crea un descrittore usando @property Decorator:
In questo usiamo la potenza dei decoratori di proprietà, che sono una combinazione di un metodo di tipo proprietà e decoratori Python.


classe Alfabeto:

def __ init __ ( self , valore):

self ._ valore = valore


# recuperando i valori ‚Äã‚Äã

@ proprietà

def valore ( self ):

print ( `Ottieni valore` )

return self ._ valore

# valori di impostazione ‚Äã‚Äã

@ valore . setter

def valore ( self , valore ):

print ( `Impostazione del valore su ` + valore)

self ._ value = valore


# rimuovi valori ‚Äã‚Äã

@ valore .deleter

def valore ( self ):

print ( `Eliminazione valore` )

del self ._ valore



# passa il valore

x = Alfabeto ( `Peter` ) p>

print (x.value)


x.value = `Diesel`


del x.value

Esci:

 Ottenere valore Peter Impostazione del valore su Diesel Eliminazione del valore 

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method