Перейти до змісту

Приховування атрибутів

В багатьох мовах програмування, які підтримують парадигму ООП, існують спеціальні модифікатори доступу атрибутів. Вони явно вказують, чи можна мати доступ до певного атрибуту класа "ззовні", або ж цей атрибут доступний тільки всередині класа.

В 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'
>>>

Невже якщо ідентифікатор атрибута починається з символів __, то до нього не можна отримати доступ ззовні класа? Насправді можна, але вже трохи важче. Необхідно вказати атрибут класа таким чином:

  1. символ підкреслення
  2. ім'я класа
  3. ім'я атрибута як у класі, тобто з двома підкресленнями на початку

Отже для вищенаведеного прикладу:

>>> p._Person__age
35
>>>

Зауважте, що це знову ж таки домовленість. В результаті "атрибут як він є" стає замаскованим. Ззовні класа такого атрибута просто не існує. Для програміста ж наявність двох символів підкреслення перед іменем атрибута повинно сигналізувати, що чіпати його поза класом не слід взагалі.

Back to top