Перейти к основному содержимому

Инкапсуляция в Python

Цель инкапсуляции — защитить данные внутри класса.

Класс хранит свои данные (свойства) и методы в одном месте и решает, как код вне класса может получить доступ к этим данным.

В результате данные сложнее изменить случайно, а внутреннее устройство класса остаётся скрытым.


Приватные свойства

Начните имя свойства с двойного подчёркивания __, и Python будет считать его приватным:

Примечание: код вне класса не имеет прямого доступа к приватному свойству.

Пример

Класс с приватным свойством __age:

Prompt
Напишите на Python класс Person с приватным свойством __age. Попробуйте обратиться к нему извне класса.
Вывод: полная программа на Python

Получение значения приватного свойства

Метод-геттер даёт внешнему коду возможность прочитать приватное свойство:

Пример

Прочитайте приватное свойство через метод-геттер:

Prompt
Напишите на Python класс Person с приватным свойством __age и методом-геттером get_age. Выведите возраст с помощью геттера.
Вывод: полная программа на Python

Изменение значения приватного свойства

Изменение приватного свойства работает так же — через метод-сеттер.

Метод-сеттер также может проверить новое значение, прежде чем его сохранить:

Пример

Измените приватное свойство через метод-сеттер:

Prompt
Напишите на Python класс Person с методами-геттером и сеттером для приватного свойства __age, с проверкой значения в сеттере.
Вывод: полная программа на Python

Зачем нужна инкапсуляция?

Инкапсуляция даёт несколько преимуществ:

  • Защита данных: данные защищены от случайных изменений
  • Проверка: новые значения можно проверить, прежде чем они будут сохранены
  • Гибкость: внутренний код может меняться, а код вне класса продолжает работать
  • Контроль: только вы решаете, как данные читаются и изменяются

Пример

Защитите значение и проверьте его с помощью инкапсуляции:

Prompt
Напишите на Python класс Student с приватным свойством __grade и методами set_grade (с проверкой значения), get_grade и get_status.
Вывод: полная программа на Python

Защищённые свойства

Для защищённых свойств в Python есть соглашение: начинать имя с одного подчёркивания _:

Примечание: это лишь соглашение, и Python не требует его соблюдения. _ просто сообщает другим программистам, что свойство предназначено для внутреннего использования.

Пример

Класс с защищённым свойством:

Prompt
Напишите на Python класс Person с защищённым свойством _salary. Покажите, что к нему всё равно можно обратиться.
Вывод: полная программа на Python

Приватные методы

Префикс из двойного подчёркивания работает и с методами, делая их приватными:

Примечание: приватный метод ведёт себя как приватное свойство: внешний код не может вызвать его напрямую. Здесь __validate доступен только другим методам класса.

Пример

Класс с приватным методом:

Prompt
Напишите на Python класс Calculator с приватным методом __validate, который используется внутри метода add.
Вывод: полная программа на Python

Искажение имён (name mangling)

Искажение имён (name mangling) — это техника, с помощью которой Python делает свойства и методы приватными.

Имя, которое начинается с двойного подчёркивания __, незаметно изменяется: Python добавляет перед ним _ClassName.

Так, __age превращается в _Person__age.

Примечание: искажённое имя действительно даёт доступ к приватному свойству (его можно использовать), но этого следует избегать, потому что это сводит на нет смысл инкапсуляции.

Пример

Посмотрите на искажённое имя в действии:

Prompt
Напишите на Python класс Person с приватным свойством __age. Обратитесь к нему с помощью искажения имён: _Person__age.
Вывод: полная программа на Python