Private Variablen und Methoden#

Eine private Variable oder private Methode ist eine Variable, die außerhalb der Methoden der Klasse, in der sie definiert ist, nicht sichtbar ist. Private Variablen und Methoden sind aus zwei Gründen nützlich:

  1. sie erhöhen die Sicherheit und Zuverlässigkeit, indem sie selektiv den Zugriff auf wichtige Teile der Implementierung eines Objekts verweigern

  2. sie verhindern Namenskonflikte, die durch die Verwendung von Vererbung entstehen können.

Eine Klasse kann eine private Variable definieren und von einer Klasse erben, die eine private Variable mit demselben Namen definiert. Private Variablen erleichtern die Lesbarkeit von Code, da sie explizit angeben, was in einer Klasse nur intern verwendet wird. Alles andere ist die Schnittstelle der Klasse.

Die meisten Sprachen, die private Variablen definieren, tun dies durch die Verwendung des Schlüsselworts private o.ä.. Die Konvention in Python ist einfacher und macht es auch leichter, sofort zu erkennen, was privat ist und was nicht. Jede Methode oder Instanzvariable, deren Name mit einem doppelten Unterstrich (__) beginnt, aber nicht endet, ist privat; alles andere ist nicht privat.

Betrachten wir als Beispiel die folgende Klassendefinition:

>>> class MyClass:
...     def __init__(self):
...         self.x = 1
...         self.__y = 2
...     def print_y(self):
...         print(self.__y)
...
>>> m = MyClass()
>>> print(m.x)
1
>>> print(m.__y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute '__y'

Die print_y-Methode ist nicht privat, und da sie sich in der MyClass-Klasse befindet, kann sie auf __y zugreifen und ausgeben:

>>> m.print_y()
2

Bemerkung

Der Mechanismus, der zur Gewährleistung der Privatsphäre verwendet wird, verfälscht den Namen privater Variablen und privater Methoden, wenn der Code zu Bytecode kompiliert wird. Konkret bedeutet dies, dass _ClassName dem Variablennamen vorangestellt wird:

>>> dir(m)
['_MyClass__y', '__class__', …]

Damit soll also lediglich ein versehentlicher Zugriff verhindert werden.