Quando si inizia a programmare in Python, è importante comprendere come controllare la visibilità degli attributi e dei metodi di una classe. Anche se Python non ha i modificatori di accesso come in altri linguaggi (es. public, private, protected in Java o C#), esistono delle convenzioni che permettono di ottenere un comportamento simile. Vediamo insieme come funzionano.
Public access (accesso pubblico): cosa significa e come si usa
In Python, per accesso pubblico si intende che un attributo o un metodo è accessibile da qualsiasi parte del programma. Questo è il comportamento predefinito, ovvero se non specifichiamo nulla, l’elemento sarà considerato pubblico.
Accesso pubblico
Nel codice seguente, l’attributo nome
è accessibile liberamente da fuori la classe:
class Persona:
def __init__(self, nome):
self.nome = nome
persona = Persona("Marco")
print(persona.nome)
Protected access (accesso protetto): convenzioni e utilizzo
Un attributo è considerato protetto se viene preceduto da un singolo underscore (_
). Non è una vera restrizione, ma una convenzione che segnala ai programmatori che quell’attributo non dovrebbe essere utilizzato al di fuori della classe o dalle sue sottoclassi.
Accesso protetto
Ecco un esempio pratico di utilizzo di un attributo protetto:
class Persona:
def __init__(self, nome):
self._nome = nome
persona = Persona("Luca")
print(persona._nome) # È accessibile, ma non è consigliato accedervi direttamente
Private access (accesso privato): come limitare l’accesso
Per rendere un attributo privato, si utilizza un doppio underscore (__
) all’inizio del nome. Questo attiva un meccanismo chiamato name mangling, che cambia internamente il nome dell’attributo per renderlo meno accessibile dall’esterno.
Accesso privato
Vediamo ora un esempio di attributo privato:
class Persona:
def __init__(self, nome):
self.__nome = nome
persona = Persona("Giulia")
# print(persona.__nome) # Questo darà errore
print(persona._Persona__nome) # Ma possiamo accedervi in questo modo
Getter e setter: accesso controllato agli attributi
Per evitare l’accesso diretto agli attributi privati o protetti, è una buona pratica usare i metodi getter e setter. Questi metodi permettono di leggere o modificare un attributo in modo controllato.
Getter e setter
Qui sotto trovi un esempio semplice:
class Persona:
def __init__(self, nome):
self.__nome = nome
def get_nome(self):
return self.__nome
def set_nome(self, nuovo_nome):
self.__nome = nuovo_nome
persona = Persona("Francesco")
print(persona.get_nome())
persona.set_nome("Andrea")
print(persona.get_nome())
Modificatori di accesso: esempi pratici per comprendere meglio
Per chiarire ulteriormente le differenze tra i tipi di accesso, vediamo una classe che li usa tutti insieme.
Accesso pubblico
class Esempio:
def __init__(self):
self.pubblico = "Sono pubblico"
Accesso protetto
class Esempio:
def __init__(self):
self._protetto = "Sono protetto"
Accesso privato
class Esempio:
def __init__(self):
self.__privato = "Sono privato"
Getter e setter
class Esempio:
def __init__(self):
self.__dato = "Dato segreto"
def get_dato(self):
return self.__dato
def set_dato(self, nuovo_valore):
self.__dato = nuovo_valore
Utilizzando queste convenzioni, possiamo scrivere codice Python più organizzato, leggibile e manutenibile. Anche se Python non impone regole rigide sull’accesso, seguire queste buone pratiche è essenziale per un progetto ben strutturato.