Python daje nam możliwość tworzenia „prywatny” metod i zmiennych w klasie przez poprzedzenie podwójne podkreślenia do nazwy, na przykład: __myPrivateMethod()
. Jak zatem to wyjaśnić
>>> 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!!
O co chodzi?!
Wytłumaczę to trochę tym, którzy tego nie rozumieją.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
To, co tam zrobiłem, to utworzenie klasy za pomocą metody publicznej i prywatnej oraz utworzenie jej instancji.
Następnie nazywam tę metodę publiczną.
>>> obj.myPublicMethod()
public method
Następnie próbuję wywołać jego prywatną metodę.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Tutaj wszystko wygląda dobrze; nie możemy tego nazwać. W rzeczywistości jest „prywatny”. Właściwie to nie jest. Uruchomienie dir () na obiekcie ujawnia nową magiczną metodę, którą Python tworzy magicznie dla wszystkich twoich „prywatnych” metod.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Nazwa tej nowej metody jest zawsze znakiem podkreślenia, po której następuje nazwa klasy, a następnie nazwa metody.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Tyle o enkapsulacji, co?
W każdym razie zawsze słyszałem, że Python nie obsługuje enkapsulacji, więc po co w ogóle próbować? Co daje?