Python дает нам возможность создавать «закрытые» методы и переменные внутри класса, добавляя к имени двойные подчеркивания, например: __myPrivateMethod()
. Как же тогда это объяснить
>>> 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!!
В чем дело?!
Я немного объясню это тем, кто не совсем понял.
>>> 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 () на объекте открывает новый магический метод, который python волшебным образом создает для всех ваших «приватных» методов.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Имя этого нового метода всегда подчеркивание, за которым следует имя класса, а затем имя метода.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Так много для инкапсуляции, а?
В любом случае, я всегда слышал, что Python не поддерживает инкапсуляцию, так зачем даже пытаться? Что дает?