Variabili Private nelle Classi

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:
  1. 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..
  1. 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..
  1. 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..
  1. 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 (, ).
Ingresso
Uscita
db = Database(); db.insert('Bob', 23); db.insert('Alice', 25); db.update('Bob', 24); db.display(); db.delete('Alice'); db.display();
Bob: 24, Alice: 25 Bob: 24
 

Constraints

Time limit: 1 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue