Zugriffsmodifikatoren
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 29 von 64.
Zugriffsmodifikatoren steuern die Sichtbarkeit von Klassenattributen und -methoden. Python verwendet Namenskonventionen anstelle von Schlüsselwörtern für die Zugriffskontrolle.
Hier ist ein Beispiel für öffentlichen Zugriff (kein Präfix):
class Person:
def __init__(self):
self.name = "Coddy" # Öffentliches Attribut
def greet(self): # Öffentliche Methode
return f"Hello, I'm {self.name}"Greifen Sie von überall auf öffentliche Member zu:
person = Person()
print(person.name) # Coddy
print(person.greet()) # Hello, I'm CoddyHier ist ein Beispiel für geschützten Zugriff (einfacher Unterstrich):
class Employee:
def __init__(self):
self._salary = 50000 # Geschütztes Attribut
def _calculate_bonus(self): # Geschützte Methode
return self._salary * 0.1
def show_bonus(self):
return self._calculate_bonus() # Verwendung innerhalb der Klasse ist OKZugriff auf geschützte Member (funktioniert, wird aber nicht empfohlen):
employee = Employee()
print(employee._salary) # 50000 - funktioniert, wird aber nicht empfohlen
print(employee.show_bonus()) # 5000.0 - korrekte VorgehensweiseHier ist ein Beispiel für privaten Zugriff (doppelter Unterstrich):
class User:
def __init__(self):
self.__password = "secure123" # Privates Attribut
def __encrypt(self, data): # Private Methode
return f"Encrypted: {data}"
def verify(self, input_password):
# Private Member sind innerhalb der Klasse zugänglich
return input_password == self.__passwordVerwenden Sie private Member korrekt:
user = User()
print(user.verify("secure123")) # True - Verwendung der öffentlichen Methode
# print(user.__password) # AttributeError - Zugriff nicht direkt möglichAusgabe:
Coddy
Hello, I'm Coddy
50000
5000.0
TrueKernpunkt: Python-Zugriffsmodifikatoren sind Namenskonventionen: kein Präfix = public (überall zugänglich), einfacher Unterstrich = protected (interne Verwendung), doppelter Unterstrich = private (nur innerhalb der Klasse). Diese helfen dabei, klare Grenzen zu ziehen und einen versehentlichen Missbrauch von Klasseninterna zu verhindern.
Aufgabe
MittelIn dieser Herausforderung implementierst du eine FileManager-Klasse, die Pythons Zugriffsmodifikatoren (öffentlich, geschützt und privat) demonstriert, während du die Vorteile umfassender Tests erlebst.
Bearbeite filemanager.py, um die FileManager-Klasse gemäß den TODO-Kommentaren zu implementieren. Die Datei enthält detaillierte Anweisungen zur Implementierung von:
- Öffentlichen Methoden für Dateioperationen
- Geschützten Methoden (mit einfachem Unterstrich-Präfix)
- Privaten Methoden (mit doppeltem Unterstrich-Präfix)
- Methodeninteraktionen, die Kapselung demonstrieren
Spickzettel
Python verwendet Namenskonventionen für die Zugriffskontrolle:
Öffentlicher Zugriff (kein Präfix) - überall zugänglich:
class Person:
def __init__(self):
self.name = "Coddy" # Öffentliches Attribut
def greet(self): # Öffentliche Methode
return f"Hello, I'm {self.name}"
person = Person()
print(person.name) # Coddy
print(person.greet()) # Hello, I'm CoddyGeschützter Zugriff (einfacher Unterstrich) - interne Verwendung, von außen nicht empfohlen:
class Employee:
def __init__(self):
self._salary = 50000 # Geschütztes Attribut
def _calculate_bonus(self): # Geschützte Methode
return self._salary * 0.1
employee = Employee()
print(employee._salary) # Funktioniert, wird aber nicht empfohlenPrivater Zugriff (doppelter Unterstrich) - nur innerhalb der Klasse:
class User:
def __init__(self):
self.__password = "secure123" # Privates Attribut
def __encrypt(self, data): # Private Methode
return f"Encrypted: {data}"
def verify(self, input_password):
return input_password == self.__password
user = User()
print(user.verify("secure123")) # True - Verwendung einer öffentlichen Methode
# print(user.__password) # AttributeError - kein direkter Zugriff möglichProbier es selbst
from file_manager import FileManager
# Umfassender Testfall-Handler
test_case = input()
if test_case == "basic_test":
# Erstelle eine FileManager-Instanz
manager = FileManager()
# Rufe die Methode read_file auf
print(manager.read_file("example.txt"))
# Rufe die Methode get_file_content auf
print(manager.get_file_content("example.txt"))
elif test_case == "protected_access":
# Erstelle eine FileManager-Instanz
manager = FileManager()
# Versuche, die geschützte Methode aufzurufen
# Geschützte Methoden sind zugänglich, aber für den internen Gebrauch gedacht
print(manager._check_permissions("example.txt"))
print("Note: Protected methods are accessible but intended for internal use only")
elif test_case == "private_access":
# Erstelle eine FileManager-Instanz
manager = FileManager()
try:
# Versuche, die private Methode direkt aufzurufen
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")
# Zugriff über die Name-Mangling-Form
print(manager._FileManager__decrypt_content("some content"))
print("Note: Accessed private method using name-mangled form")
elif test_case == "method_chaining":
# Erstelle eine FileManager-Instanz
manager = FileManager()
# Demonstriere, wie get_file_content intern sowohl geschützte als auch private Methoden aufruft
print("Calling get_file_content which internally uses protected and private methods:")
print(manager.get_file_content("example.txt"))
elif test_case == "multiple_files":
# Erstelle eine FileManager-Instanz
manager = FileManager()
# Verarbeite mehrere Dateien
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":
# Erstelle eine FileManager-Instanz
manager = FileManager()
# Demonstriere 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")Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen