In Python gibt es keine privaten Variablen wie in C++ oder Java. Sie könnten auch jederzeit auf jede Mitgliedsvariable zugreifen, wenn Sie das wollten. Allerdings braucht man in Python keine privaten Variablen, denn in Python ist es nicht schlimm, die Mitgliedsvariablen der Klasse offenzulegen. Wenn Sie eine Mitgliedsvariable kapseln müssen, können Sie dies später mit "@property" tun, ohne den bestehenden Client-Code zu verändern.
In Python wird der einzelne Unterstrich "_" verwendet, um anzuzeigen, dass eine Methode oder Variable nicht als Teil der öffentlichen API einer Klasse angesehen wird und dass sich dieser Teil der API zwischen verschiedenen Versionen ändern kann. Sie können diese Methoden/Variablen verwenden, aber Ihr Code könnte kaputt gehen, wenn Sie eine neuere Version dieser Klasse verwenden.
Der doppelte Unterstrich "__" steht nicht für eine "private Variable". Sie verwenden ihn, um Variablen zu definieren, die "klassenlokal" sind und die nicht einfach von Unterklassen überschrieben werden können. Der Name der Variablen wird dadurch verfälscht.
Zum Beispiel:
class A(object):
def __init__(self):
self.__foobar = None # will be automatically mangled to self._A__foobar
class B(A):
def __init__(self):
self.__foobar = 1 # will be automatically mangled to self._B__foobar
Der Name von self.__foobar wird in Klasse A automatisch in self._A__foobar umgewandelt. In Klasse B wird er in self._B__foobar umgewandelt. Jede Unterklasse kann also ihre eigene Variable __foobar definieren, ohne ihre Elternvariable(n) zu überschreiben. Aber nichts hindert Sie daran, auf Variablen zuzugreifen, die mit doppelten Unterstrichen beginnen. Allerdings verhindert die Namensvermischung, dass Sie diese Variablen/Methoden zufällig aufrufen.
Ich empfehle Ihnen dringend, sich Raymond Hettingers Pythons Werkzeugkasten für die Klassenentwicklung von Pycon 2013, das ein gutes Beispiel dafür liefert, warum und wie Sie @property und "__"-Instanzvariablen verwenden sollten.
Wenn Sie öffentliche Variablen ausgesetzt haben und diese kapseln müssen, können Sie @property verwenden. Sie können also mit der einfachsten Lösung beginnen. Sie können Mitgliedsvariablen öffentlich lassen, es sei denn, Sie haben einen konkreten Grund, dies nicht zu tun. Hier ist ein Beispiel:
class Distance:
def __init__(self, meter):
self.meter = meter
d = Distance(1.0)
print(d.meter)
# prints 1.0
class Distance:
def __init__(self, meter):
# Customer request: Distances must be stored in millimeters.
# Public available internals must be changed.
# This would break client code in C++.
# This is why you never expose public variables in C++ or Java.
# However, this is python.
self.millimeter = meter * 1000
# In python we have @property to the rescue.
@property
def meter(self):
return self.millimeter *0.001
@meter.setter
def meter(self, value):
self.millimeter = meter * 1000
d = Distance(1.0)
print(d.meter)
# prints 1.0