🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Modificatori di Accesso in Python

Codegrind TeamJul 22 2023

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.