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 () на об'єкт виявляє новий магічний метод, який пітон створює магічно для всіх ваших "приватних" методів.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Ім'я нового методу завжди є підкресленням, за ним - ім'я класу, а потім ім'я методу.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Стільки для інкапсуляції, так?
У будь-якому випадку, я завжди чув, що Python не підтримує інкапсуляцію, так навіщо навіть намагатися? Що дає?