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 _ _

    1. class Prova():
    2. def __metodoprivato(self):
    3. 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.

     


     

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

    FacebookTwitterLinkedinLinkedin
    knowledge base

    Classi Python