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 не поддерживает инкапсуляцию, так зачем даже пытаться? Что дает?