Funzione getattr python

La funzione getattr di python mi permette di leggere un attributo interno di una classe ( oggetto ) o di eseguire un metodo dall'esterno di una classe stessa.

getattr(classe,attributo [,y])

La funzione ha due argomenti obbligatori:

  • Il nome della classe
  • Il nome dell'attributo tra apici (o la variabile che contiene il nome dell'attributo )

Nota. L'opzione facoltativa y restituisce in output una costante se l'attributo non esiste nella classe. E' molto utile perché evita di generare un errore nel caso in cui l'attributo non esista.

Ecco alcuni esempi pratici

Come leggere un attributo della classe

Esempio 1

Creo un oggetto classe di nome Persone()

La classe contiene un attributo (name) e un metodo (say).

  1. class Persone():
  2. name = 'Andrea'
  3. def say(self, what):
  4. print(self.name, what)
  5. print(getattr(Persone, 'name'))

Nella riga 5, situata all'esterno della classe Persone(), leggo il contenuto dell'attributo 'name' e lo stampo sullo schermo.

Il risultato in output è il seguente:

Andrea

Pur trovandomi all'esterno della classe, grazie alla funzione getattr() sono riuscito ad accedere all'informazione.

Esempio 2

In alternativa posso ottenere lo stesso risultato assegnando l'oggetto a una variabile dello script.

  1. class Persone():
  2. name = 'Andrea'
  3. def say(self, what):
  4. print(self.name, what)
  5. var = Persone()
  6. attributo='name'
  7. print(getattr(var, attributo))

In questo caso ho assegnato l'oggetto Persone() alla variabile var.

Il risultato finale in output è sempre lo stesso

Andrea

E se l'attributo non esiste nella classe?

In questo caso la funzione getattr() restituisce un errore.

Quindi, occorre fare attenzione.

>>> print(getattr(Persone, 'name'))
Traceback (most recent call last):
File, line 13, in <module>
print(getattr(Persone, 'name2'))
AttributeError: type object 'Persone' has no attribute 'name2'

Per evitare questo problema, mi basta aggiungere il terzo parametro opzionale con una costante qualsiasi ( es. 0 ).

>> print(getattr(Persone, 'name2',0))

Se l'attributo non esiste, la funzione restituisce il valore della costante

0

Per non avere alcun output dalla funzione, mi basta inserire come parametro una stringa vuota.

print(getattr(Persone, 'name2',0))

E così via

Come eseguire un metodo della classe

Riprendo il codice sorgente dell'esempio precedente.

Ora provo a eseguire un metodo interno alla classe.

  1. class Persone():
  2. name = 'Andrea'
  3. def say(self, what):
  4. print(self.name, what)
  5. var = Persone()
  6. getattr(var, 'say')('Hello World!')

Nella riga 6 uso la funzione getattr per eseguire il metodo 'say' nella classe Persone.

Il parametro da passare è posto tra parentesi più a destra.

Attenzione. Per funzionare devo necessariamente assegnare l'oggetto a una variabile (var).

Il risultato in output è il seguente:

Hello World!

La funzione ha eseguito il metodo say dall'esterno della classe.

E se il metodo non esiste?

Anche in questo caso l'interprete python restituisce un errore.

getattr(var, 'saynot')('Hello')
Traceback (most recent call last):
File, line 17, in <module>
getattr(var, 'saynot')('Hello')
AttributeError: 'Persone' object has no attribute 'saynot'

Per evitare l'errore posso eseguire la funzione getattr in una struttura condizionale, dopo aver verificato l'esistenza del metodo nella classe tramite la funzione hasattr().

if (hasattr(var, 'saynot')):
getattr(var, 'saynot')('Hello')

Un'altra soluzione alternativa è gestire l'errore come un'eccezione.

E così via.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Classi Python