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