Python-Klassen ermöglichen es uns, Code zu strukturieren, indem zusammengehörige Daten und Funktionen gekapselt werden. Manchmal möchte man verhindern, dass Variablen von außerhalb einer Klasse verwendet werden. Um dies zu unterstützen, erlaubt Python die Verwendung privater Variablen in Klassen, damit Nutzer des Codes nicht direkt auf sie zugreifen können. Private Variablen werden durch zwei Unterstriche zu Beginn des Variablennamens (__) gekennzeichnet. Während öffentliche Variablen (public variables) problemlos von außen zugänglich sind, ist dies bei privaten Variablen nicht der Fall. Sehen wir uns ein Beispiel an:
class PublicPrivateExample:
def __init__(self):
self.public_var = 'I am public!' # Public variable
self.__private_var = 'I am private!' # Private variable
example = PublicPrivateExample()
print(example.public_var) # 'I am public!'
print(example.__private_var) # Raises AttributeError
In diesem Fall erkennen wir, dass die öffentliche Variable ohne Weiteres zugänglich ist. Versucht man jedoch, auf die private Variable zuzugreifen, löst Python eine AttributeError-Ausnahme aus.
Python verfügt im Gegensatz zu Sprachen wie Java oder C++ nicht über strikt durchgesetzte private Mitglieder. In Python ist eine private Variable lediglich eine Konvention, die andeutet, dass man sie nicht direkt verwenden sollte. Python wendet sogenanntes Name Mangling an, um es weniger wahrscheinlich zu machen, eine private Variable versehentlich zu ändern oder zu lesen. Dennoch kann man weiterhin auf sie zugreifen, was aber normalerweise nicht empfohlen wird:
print(example._PublicPrivateExample__private_var) # I am private!
Der Zugriff auf die private Variable erfolgt hier über _ClassName__private_var. Dies macht den direkten Zugriff umständlicher und fördert die Kapselung. Wenn man den Wert einer privaten Variable in einem kontrollierten Rahmen bereitstellen möchte, sollte man stattdessen öffentliche Methoden dafür verwenden:
class PublicPrivateExample:
def __init__(self):
self.__private_var = 'I am private!'
def get_private_var(self): # Getter method for private variable
return self.__private_var # We can access private fields inside the class
example = PublicPrivateExample()
print(example.get_private_var()) # Will print 'I am private!'
Hier wird eine öffentliche Methode get_private_var eingesetzt, um kontrolliert auf die private Variable zuzugreifen. Auf diese Weise behält man die Kapselung und schützt die eigenen Daten.
💭
Beachte, dass das Arbeiten mit privaten Variablen Teil der sogenannten Kapselung (Encapsulation) ist – einem Grundpfeiler der objektorientierten Programmierung. So werden Daten davor geschützt, unerwartet verändert oder gelesen zu werden.
Obwohl Python private Variablen nicht strikt durchsetzt, ist es dennoch ratsam, sie zu verwenden, um den Code wartbarer und robuster zu gestalten.
Challenge: Database Class
Du sollst eine Klasse Database in Python entwickeln, die name: value-Paare speichert. Die Datenbank soll als privates Dictionary in der Database-Klasse angelegt werden.
Die Klasse Database soll folgende Methoden haben:
insert(name, value): Diese Methode fügt ein neues name: value-Paar in die Datenbank ein. Wenn name bereits in der Datenbank existiert, soll eine Meldung erscheinen: Name already exists in the database..
delete(name): Diese Methode entfernt ein bestehendes name: value-Paar aus der Datenbank. Wenn name nicht existiert, soll eine Meldung ausgegeben werden: Name does not exist in the database..
update(name, value): Diese Methode aktualisiert den value zu einem bestehenden name in der Datenbank. Existiert der name nicht, so soll eine Meldung ausgegeben werden: Name does not exist in the database..
display(): Diese Methode zeigt alle name: value-Paare in der Datenbank in der Form name: value an. Verschiedene Einträge sollen mit , (Komma und Leerzeichen) getrennt werden.