Найти в Дзене
programmer's notes (python and more)

ООП на Python. Защита переменных и методов. Приложение к видеоуроку 12

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Теперь в Дзен есть Подборки. Данная статья относится к подборке

ООП в Python
programmer's notes

Приложение к видео

Защита переменных и методов в Python

Защита свойств и методов класса — что это значит? Определённую аналогию можно провести с операционной системой. Есть обыкновенные пользователи, а есть администраторы. Администраторы имеют доступ к некоторым функциям и командам, недоступным обыкновенным пользователям. Когда речь идет о классах, то код вне класса, как бы является обыкновенным пользователем, а код внутри класса (методы класса) это администраторы.

В ООП обычно определяют три уровня доступа: public — свойства и методы доступны изнутри и извне класса; protected — доступ к этим методам и свойствам закрыт для кода вне класса, но доступен для кода внутри класса и для кода внутри дочерних классов; private — доступ к таким методам и свойствам возможен только из кода внутри класса.

Эти уровни в Python регулируются особенностями имени переменных и методов:

  1. Обычное имя, перед которым нет ни одного знака подчеркивания относится к переменным и методам типа public.
  2. Имя, перед которым стоит один символ подчеркивания, определяет переменную или метод типа protected. Однако до сих пор это было только декларативное утверждение, не поддерживаемое интерпретатором python. Это удобно для чтения и модификации программы, и только.
  3. Имя, перед которым стоят два символа подчёркивания относится к типу private. И это поддерживается на уровне интерпретатора. Но есть маленькое исключение: __имя__ — относится к типу public.

Рассмотрим следующий пример.

Текст программы см. ниже
Текст программы см. ниже
primer26.py

Результат выполнения программы

100 200

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

Следующий пример относится к переменным типа private.

Текст программы см. нижу
Текст программы см. нижу
primer27.py

Результат выполнения программы

100 200
Traceback (most recent call last):
 File "/home/vladislav/Yandex.Disk/projects/programming/python/oop11/./p2.py", line 14, in <module>
   print(a1.__a, a1.__b)
AttributeError: 'A' object has no attribute '__a'

Метод класса имеет доступ к переменным private, но прямого доступа к ним нет.

Следующий пример демонстрирует пример метода private.

Текст программы см. ниже
Текст программы см. ниже
primer28.py

Результат выполнения программы

100 200

Мы получаем доступ к закрытому методу, через метод открытый. Вызов же a1.__pri() извне класса невозможен.

Ну и последнее. Всё таки доступ к защищенным переменным методам и переменным получить можно. Дело в том, что переменные и метода типа private получают еще одно имя, по которому к ним можно получить доступ. Если в предыдущем примере после строки

a1 = A(100, 200)

выполнить

dir(a1)

то мы получим имена переменных класса, в том числе альтернативные имена закрытых переменных и методов. Соответственно для закрытых членов класса получим _A__a, _A__b, _A__pri. И тут доступ уже совершенно свободный, например, a1._A__pri(). Не много забавно, для любителей других языков программирования. Не правда ли? Но, на самом деле, это всё дело вкуса, да простят меня приверженцы "чистого" программирования. ;)

Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Я в упор не вижу вашей программы
Я в упор не вижу вашей программы