Modificatori di accesso
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 29 di 64.
I modificatori di accesso controllano la visibilità degli attributi e dei metodi di una classe. Python usa convenzioni di denominazione anziché parole chiave per il controllo degli accessi.
Ecco un esempio di accesso pubblico (senza prefisso):
class Person:
def __init__(self):
self.name = "Coddy" # Attributo pubblico
def greet(self): # Metodo pubblico
return f"Hello, I'm {self.name}"Accedi ai membri pubblici da qualsiasi punto:
person = Person()
print(person.name) # Coddy
print(person.greet()) # Hello, I'm CoddyEcco un esempio di accesso protetto (underscore singolo):
class Employee:
def __init__(self):
self._salary = 50000 # Attributo protetto
def _calculate_bonus(self): # Metodo protetto
return self._salary * 0.1
def show_bonus(self):
return self._calculate_bonus() # Si può usare all'interno della classeAccedi ai membri protetti (funziona, ma non è consigliato):
employee = Employee()
print(employee._salary) # 50000 - funciona, pero no se recomienda
print(employee.show_bonus()) # 5000.0 - forma correctaEcco un esempio di accesso privato (doppio underscore):
class User:
def __init__(self):
self.__password = "secure123" # Attributo privato
def __encrypt(self, data): # Metodo privato
return f"Encrypted: {data}"
def verify(self, input_password):
# Membri privati accessibili all'interno della classe
return input_password == self.__passwordUsa correttamente i membri privati:
user = User()
print(user.verify("secure123")) # True - utilizza un metodo pubblico
# print(user.__password) # AttributeError - non è possibile accedervi direttamenteOutput:
Coddy
Hello, I'm Coddy
50000
5000.0
TruePunto chiave: i modificatori di accesso di Python sono convenzioni di denominazione: nessun prefisso = pubblico (accessibile ovunque), un singolo trattino basso = protetto (uso interno), due trattini bassi = privato (solo nella classe). Aiutano a stabilire confini chiari e a prevenire l'uso improprio accidentale degli elementi interni della classe.
Sfida
MedioIn questa sfida implementerai una classe FileManager che dimostra i modificatori di accesso di Python (pubblico, protetto e privato), sperimentando al contempo i vantaggi dei test completi.
Modifica filemanager.py per implementare la classe FileManager seguendo i commenti TODO. Il file contiene istruzioni dettagliate per implementare:
- Metodi pubblici per le operazioni sui file
- Metodi protetti (con prefisso di un singolo trattino basso)
- Metodi privati (con prefisso di due trattini bassi)
- Interazioni tra metodi che dimostrano l'incapsulamento
Provalo tu
from file_manager import FileManager
# Gestore completo dei casi di test
test_case = input()
if test_case == "basic_test":
# Crea un'istanza di FileManager
manager = FileManager()
# Chiama il metodo read_file
print(manager.read_file("example.txt"))
# Chiama il metodo get_file_content
print(manager.get_file_content("example.txt"))
elif test_case == "protected_access":
# Crea un'istanza di FileManager
manager = FileManager()
# Prova a chiamare il metodo protetto
# I metodi protetti sono accessibili, ma sono destinati all'uso interno
print(manager._check_permissions("example.txt"))
print("Note: Protected methods are accessible but intended for internal use only")
elif test_case == "private_access":
# Crea un'istanza di FileManager
manager = FileManager()
try:
# Prova a chiamare direttamente il metodo privato
print(manager.__decrypt_content("some content"))
except AttributeError as e:
print(f"Error: {e}")
print("Private methods are name-mangled and cannot be accessed directly")
# Accedi usando la forma con name mangling
print(manager._FileManager__decrypt_content("some content"))
print("Note: Accessed private method using name-mangled form")
elif test_case == "method_chaining":
# Crea un'istanza di FileManager
manager = FileManager()
# Mostra come get_file_content chiama internamente sia i metodi protetti sia quelli privati
print("Calling get_file_content which internally uses protected and private methods:")
print(manager.get_file_content("example.txt"))
elif test_case == "multiple_files":
# Crea un'istanza di FileManager
manager = FileManager()
# Elabora più file
files = ["document.txt", "image.jpg", "data.csv"]
for file in files:
print(f"\
Processing {file}:")
print(manager.read_file(file))
print(manager.get_file_content(file))
elif test_case == "name_mangling":
# Crea un'istanza di FileManager
manager = FileManager()
# Mostra il funzionamento del name mangling
print("Python's name mangling for private methods:")
print("Attempting direct access would fail with AttributeError")
print("Using mangled name:")
print(manager._FileManager__decrypt_content("private data"))
print("\
Name mangling is Python's mechanism to prevent accidental access")
print("It renames __method to _ClassName__method internally")Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online