
Gli attributi degli oggetti in Python
In questa lezione del corso Python ti parlo degli attributi degli oggetti.
Nel linguaggio Python gli oggetti sono associati a degli identificativi detti attributi.
Per accedere agli attributi di un oggetto, devi scrivere il nome dell'oggetto seguito da un punto e dal nome dell'attributo,
oggetto.attributo
Esistono due tipi di attributi
- I metodi
Sono attributi chiamabili (callable) perché puoi chiamarli per eseguire delle operazioni. I metodi sono sempre seguiti da due parentesi tonde ( ) tra le quali puoi inserire eventuali argomenti. Le parentesi vanno aggiunte anche se non ci sono argomenti. In pratica, i metodi sono funzioni in comune che puoi chiamare ed eseguire su tutti gli oggetti della stessa classe.
oggetto.metodo()
- Le proprietà
Sono attributi non chiamabili perché non eseguono delle operazioni. Puoi usare le proprietà per accedere ad alcune informazioni dell'oggetto. In questo caso le parentesi tonde non devi inserirle. Tutti gli oggetti dello stesso tipo o classe hanno le stesse proprietà.
oggetto.proprietà
Qual è la differenza tra metodi e proprietà? Un metodo esegue un'operazione sull'oggetto, mentre una proprietà è un valore associato a una caratteristica dell'oggetto. Ad esempio, se l'oggetto fosse una persona, un metodo potrebbe essere un'azione (es. correre, camminare, parlare, ecc.) mentre una proprietà potrebbe essere l'età, il peso o l'altezza della persona.
Ti faccio un esempio pratico.
Definisci un numero complesso nella variabile num
>>> num = 2+3j
Si tratta di un oggetto del tipo "complex"
>>> type(num)
<type 'complex'>
Tutti gli oggetti del tipo "complex" hanno delle proprietà e dei metodi predefiniti che puoi usare.
Digita num.conjugate()
>>> num.conjugate()
Si tratta di un metodo perché ha le parentesi tonde ( ).
Nota. Nei metodi le parentesi tonde ( ) devi aggiungerle sempre, anche se non ci sono argomenti che vuoi passare.
Il metodo .conjugate() ti restituisce il numero coniugato del numero complesso
In questo caso il coniugato di 2+3j è il numero complesso 2-3j
(2-3j)
Ora digita num.real
>>> num.real
L'attributo .real non ha le parentesi, quindi è una proprietà.
Ti restituisce la parte reale del numero complesso
In questo caso la parte reale del numero complesso num=2+3j è 2.0
2.0
Attenzione. Non aggiungere mai le parentesi tonde a una proprietà. Se lo fai Python restituisce un errore. Devi usare le parentesi tonde solo sui metodi ossia sugli oggetti chiamabili.
Un altro attributo molto utile dei numeri complessi è la proprietà .imag
Digita num.imag
>>> num.imag
In questo caso la proprietà restituisce la parte immaginaria del numero complesso 2+3j ossia il coefficente 3.0
3.0
Come si fa a capire se un attributo è un metodo chiamabile oppure no? Per capirlo puoi usare la funzione callable(). Ad esempio digita
>>> callable(num.conjugate)
La funzione restituisce True (vero) perché l'attributo .conjugate è un metodo degli oggetti di tipo complex. Non è una proprietà.
True
Come si fa a conoscere tutti gli attributi di un oggetto?
Se vuoi conoscere tutti gli attributi di un oggetto puoi usare la funzione dir
dir(oggetto)
Ad esempio, digita dir(num)
>>> dir(num)
La funzione restituisce l'elenco degli attributi degli oggetti di tipo 'complex'
['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']
E per verificare se un oggetto ha un determinato attributo?
Per verificare se l'oggetto ha un determinato attributo, invece, puoi usare la funzione hasattr()
hasattr(oggetto, attributo)
Ad esempio, digita hasattr(num,'conjugate')
>>> hasattr(num,'conjugate')
La funzione verifica se l'oggetto num ha l'attributo 'conjugate'.
La risposta è True (vero) perché l'oggetto num è di tipo 'complex' e tutti gli oggetti di questo tipo possono accedere al metodo conjugate().
True
In questo modo Python ti permette sempre di capire quali sono gli attributi utilizzabili di un oggetto.