Python gibt uns die Möglichkeit, 'private' Methoden und Variablen innerhalb einer Klasse zu erstellen, indem dem Namen doppelte Unterstriche vorangestellt werden : __myPrivateMethod()
. Wie kann man das dann erklären?
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Was ist das Problem?!
Ich werde dies ein wenig für diejenigen erklären, die das nicht ganz verstanden haben.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Dort habe ich eine Klasse mit einer öffentlichen und einer privaten Methode erstellt und instanziiert.
Als nächstes rufe ich seine öffentliche Methode auf.
>>> obj.myPublicMethod()
public method
Als nächstes versuche ich, seine private Methode aufzurufen.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Hier sieht alles gut aus; wir können es nicht nennen. Es ist in der Tat "privat". Nun, eigentlich ist es nicht. Wenn Sie dir () für das Objekt ausführen, wird eine neue magische Methode angezeigt, die Python auf magische Weise für alle Ihre "privaten" Methoden erstellt.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Der Name dieser neuen Methode ist immer ein Unterstrich, gefolgt vom Klassennamen, gefolgt vom Methodennamen.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Soviel zur Kapselung, was?
Auf jeden Fall hatte ich immer gehört, dass Python die Kapselung nicht unterstützt. Warum also überhaupt versuchen? Was gibt?