Modificatori di Accesso in Python
I modificatori di accesso definiscono il livello di visibilità e accessibilità degli attributi e dei metodi all’interno di una classe in Python. Sebbene Python non abbia modificatori di accesso “veri e propri” come altri linguaggi, utilizza delle convenzioni per controllare l’accesso agli attributi e ai metodi. Esploriamo come funzionano questi concetti di accesso nelle classi Python.
Public Access (Accesso Pubblico)
In Python, gli attributi e i metodi sono pubblici per impostazione predefinita, il che significa che possono essere accessibili da qualsiasi parte del codice, sia all’interno che all’esterno della classe.
class Persona:
nome = "Alice"
persona = Persona()
print(persona.nome) # Accesso pubblico: "Alice"
Protected Access (Accesso Protetto)
Python utilizza una convenzione per segnalare che un attributo o un metodo dovrebbe essere trattato come “protetto”. Un attributo o metodo protetto inizia con un singolo underscore _
.
class Persona:
_nome = "Alice" # Attributo protetto
persona = Persona()
print(persona._nome) # Accesso protetto: "Alice"
Anche se è possibile accedere agli attributi protetti dall’esterno della classe, è consigliato trattarli come se fossero privati.
Private Access (Accesso Privato)
Anche se Python non impedisce l’accesso agli attributi o ai metodi privati dall’esterno della classe, utilizza una convenzione per segnalare che questi dovrebbero essere trattati come “privati”. Gli attributi o metodi privati iniziano con due underscore __
.
class Persona:
__nome = "Alice" # Attributo privato
persona = Persona()
# Il seguente causerebbe un errore poiché __nome è considerato privato
# print(persona.__nome)
Getter e Setter
Per modificare o recuperare attributi protetti o privati, è comune utilizzare metodi getter e setter.
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("Alice")
print(persona.get_nome()) # Recupero attributo privato tramite metodo getter
persona.set_nome("Bob") # Imposto attributo privato tramite metodo setter
Modificatori di Accesso: Esempi Pratici
I modificatori di accesso in Python, sebbene siano basati su convenzioni anziché restrizioni rigorose, offrono un modo strutturato per controllare l’accesso agli attributi e ai metodi all’interno delle classi. Ecco degli esempi pratici che mostrano perché e dove utilizzare questi modificatori di accesso.
Accesso Pubblico
Gli attributi e i metodi pubblici sono accessibili ovunque, sia all’interno che all’esterno della classe. Questi dovrebbero essere utilizzati per funzionalità fondamentali e condivise.
class Veicolo:
def __init__(self, marca):
self.marca = marca
def descrizione(self):
return f"Questo è un veicolo di marca {self.marca}"
auto = Veicolo("Toyota")
print(auto.descrizione()) # "Questo è un veicolo di marca Toyota"
Accesso Protetto
Gli attributi o i metodi protetti sono spesso utilizzati quando si vuole limitare l’accesso dall’esterno della classe, ma si desidera comunque consentire accesso o modifica controllata.
class Banca:
def __init__(self):
self._saldo = 0
def deposito(self, importo):
self._saldo += importo
def get_saldo(self):
return self._saldo
conto = Banca()
conto.deposito(100)
print(conto.get_saldo()) # 100
Accesso Privato
Gli attributi o i metodi privati dovrebbero essere utilizzati quando si vuole nascondere completamente l’implementazione interna e si vuole evitare l’accesso diretto dall’esterno.
class Cifrario:
def __init__(self, messaggio):
self.__messaggio = messaggio
def cifra(self):
return self.__messaggio[::-1]
def decifra(self):
return self.__messaggio[::-1]
cifrato = Cifrario("segreto")
print(cifrato.cifra()) # "oterges"
print(cifrato.decifra()) # "oterges"
Getter e Setter
I getter e i setter sono spesso utilizzati per controllare l’accesso e la modifica degli attributi, consentendo una gestione più controllata e personalizzata.
class Utente:
def __init__(self, nome):
self.__nome = nome
def get_nome(self):
return self.__nome
def set_nome(self, nuovo_nome):
if nuovo_nome.isalpha():
self.__nome = nuovo_nome
utente = Utente("Alice")
utente.set_nome("123") # Il nome non cambia perché non è alfabetico
print(utente.get_nome()) # "Alice"
Conclusione
Python utilizza convenzioni come gli underscore per indicare accesso protetto e privato, ma non fornisce veri e propri modificatori di accesso. La comunità Python promuove il principio della fiducia nel programmatore, consentendo l’accesso agli attributi e ai metodi anche se sono dichiarati come protetti o privati. L’uso di getter e setter è una pratica comune per accedere agli attributi protetti o privati in modo controllato.