Le classi in Python ci permettono di organizzare il codice incapsulando dati e funzioni correlati. In alcuni casi, potremmo voler proibire l'accesso a certe variabili dall'esterno della classe. Python permette di avere variabili private nelle classi per impedire agli utenti del codice di accedere a queste variabili. Le variabili private si definiscono mettendo due underscore all'inizio del nome della variabile (__). Mentre le variabili pubbliche possono essere direttamente accessibili dall'esterno della classe, le variabili private no. Vediamo un esempio:
class PublicPrivateExample:
def __init__(self):
self.public_var = 'I am public!' # Variabile pubblica
self.__private_var = 'I am private!' # Variabile privata
example = PublicPrivateExample()
print(example.public_var) # 'I am public!'
print(example.__private_var) # Genera AttributeError
In questo caso, possiamo vedere che la variabile pubblica è facilmente accessibile. Tuttavia, se proviamo ad accedere alla variabile privata, Python genererà un AttributeError.
Python non ha membri privati rigorosi come altri linguaggi come Java o C++. In Python, un membro privato è semplicemente una convenzione che suggerisce di non accedere al membro direttamente. Python utilizza il name mangling per rendere meno probabile l'accesso o la modifica accidentale di una variabile privata. Tuttavia, è comunque possibile accedervi se necessario, anche se generalmente è sconsigliato:
print(example._PublicPrivateExample__private_var) # I am private!
L'accesso alla variabile privata viene effettuato utilizzando _ClassName__private_var. Questo scoraggia il suo accesso diretto e promuove l'incapsulamento. Dovresti fornire metodi pubblici se vuoi consentire l'accesso alle variabili private:
class PublicPrivateExample:
def __init__(self):
self.__private_var = 'I am private!'
def get_private_var(self): # Metodo getter per la variabile privata
return self.__private_var # Possiamo accedere ai campi privati all'interno della classe
example = PublicPrivateExample()
print(example.get_private_var()) # Stamperà 'I am private!'
Qui utilizziamo un metodo pubblico get_private_var per fornire un modo controllato di accedere alla nostra variabile privata. In questo modo, manteniamo l'incapsulamento e l'integrità dei nostri dati.
💭
Ricorda che l'uso di variabili private fa parte della pratica dell'incapsulamento, uno dei fondamenti della Programmazione Orientata agli Oggetti. Protegge i dati da modifiche o accessi inattesi.
Quindi, anche se Python non applica rigorosamente le variabili private, è buona pratica usarle per rendere il tuo codice più mantenibile e privo di errori.
Sfida: Classe Database
Ti viene chiesto di sviluppare una classe Database in Python che memorizzi coppie name: value. Il database dovrebbe essere rappresentato come un dizionario privato all'interno della classe Database.
La classe Database dovrebbe avere i seguenti metodi:
insert(name, value): Questo metodo dovrebbe inserire una nuova coppia name: value nel database. Se il name esiste già nel database, dovrebbe stampare un messaggio dicendo Name already exists in the database..
delete(name): Questo metodo dovrebbe eliminare una coppia name: value esistente dal database. Se il name non esiste, dovrebbe stampare un messaggio dicendo Name does not exist in the database..
update(name, value): Questo metodo dovrebbe aggiornare il value di un name esistente nel database. Se il name non esiste, dovrebbe stampare un messaggio dicendo Name does not exist in the database..
display(): Questo metodo dovrebbe visualizzare tutte le coppie name: value nel database nel formato name: value. Tutte le coppie dovrebbero essere separate da una virgola e uno spazio (, ).