Приховування атрибутів
В багатьох мовах програмування, які підтримують парадигму ООП, існують спеціальні модифікатори доступу атрибутів. Вони явно вказують, чи можна мати доступ до певного атрибуту класа "ззовні", або ж цей атрибут доступний тільки всередині класа.
В Python механізму модифікаторів доступу не існує. Для імітації приховування атрибутів в Python використовується домовленість згідно якої якщо ідентифікатор атрибута починається з знака підкреслення, то цей атрибут призначено виключно для внутрішнього використання.
>>> class Person:
... def __init__(self, age):
... self._age = age
...
>>>
Але домовленість — це не синтаксичне правило мови програмування, і при великому бажанні її можна порушити:
>>> p = Person(35)
>>> p._age
35
>>>
Звісно, що порушувати домовленості — річ погана.
Можна ще більше приховати атрибут класа. Для цього його ідентифікатор має починатись не з одного, а з двох знаків підкреслення:
>>> class Person:
... def __init__(self, age):
... self.__age = age
...
>>> p = Person(35)
>>> p.__age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__age'
>>>
Невже якщо ідентифікатор атрибута починається з символів __
, то до нього не можна отримати доступ ззовні класа?
Насправді можна, але вже трохи важче.
Необхідно вказати атрибут класа таким чином:
- символ підкреслення
- ім'я класа
- ім'я атрибута як у класі, тобто з двома підкресленнями на початку
Отже для вищенаведеного прикладу:
>>> p._Person__age
35
>>>
Зауважте, що це знову ж таки домовленість. В результаті "атрибут як він є" стає замаскованим. Ззовні класа такого атрибута просто не існує. Для програміста ж наявність двох символів підкреслення перед іменем атрибута повинно сигналізувати, що чіпати його поза класом не слід взагалі.