I metodi e gli attributi privati in una classe python
I metodi e attributi privati sono funzioni utilizzabili soltanto all'interno di una classe. Per scrivere un metodo o un attributo privato basta anteporre due caratteri underscore prima del nome.
__metodoprivato
Sono detti "privati" perché non possono essere richiamati dall'esterno della classe.
Esempio
In questo script creo una classe con un metodo privato.
Il suo nome comincia con due underscore _ _
- class Prova():
- def __metodoprivato(self):
- print("metodo nascosto")
Essendo un metodo privato, non può essere letto dal resto del programma.
Se provassi a richiamarlo in un'istanza, l'interprete python non troverebbe un attributo con questo nome, restituendo un messaggio di errore
>>> oggetto = Prova()
>>> prova.__metodoprivato()
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
oggetto.metodoprivato()
AttributeError: 'Prova' object has no attribute '__metodoprivato'
Eppure esiste nella classe.
Per vederlo basta eseguire la funzione dir sul nome della classe.
>>> dir(Prova)
['_Prova__metodoprivato', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'metodo1', 'metodo2', 'metodo3', 'nome']
Il metodo privato esiste nella classe ma ha il nome _Prova__metodoprivato.
Non ha lo stesso nome con cui l'ho definito nello script ossia __metodoprivato.
Nota. Per nasconderlo l'interprete python ha semplicemente aggiunto un underscore e il nome della classe ( _Prova ) come prefisso. Il resto del nome del metodo è uguale.
Come accedere a un metodo privato
Per usare un metodo privato anche al di fuori della classe c'è comunque un trucco.
Se provassi a scrivere un'istanza scrivendo la denominazione completa _Prova__metodoprivato, così come appare nell'istruzione dir della classe, l'istanza funzionerebbe correttamente.
>>> oggetto = Prova()
>>> oggetto._Prova__metodoprivato()
metodo nascosto
Grazie a questo escamotage posso accedere a metodi e attributi privati anche dall'esterno della classe.
E così via.