Доброго времени суток, читатели, зрители моего канала programmer's notes.
Теперь в Дзен есть Подборки. Данная статья относится к подборке
Приложение к видео
Защита переменных и методов в Python
Защита свойств и методов класса — что это значит? Определённую аналогию можно провести с операционной системой. Есть обыкновенные пользователи, а есть администраторы. Администраторы имеют доступ к некоторым функциям и командам, недоступным обыкновенным пользователям. Когда речь идет о классах, то код вне класса, как бы является обыкновенным пользователем, а код внутри класса (методы класса) это администраторы.
В ООП обычно определяют три уровня доступа: public — свойства и методы доступны изнутри и извне класса; protected — доступ к этим методам и свойствам закрыт для кода вне класса, но доступен для кода внутри класса и для кода внутри дочерних классов; private — доступ к таким методам и свойствам возможен только из кода внутри класса.
Эти уровни в Python регулируются особенностями имени переменных и методов:
- Обычное имя, перед которым нет ни одного знака подчеркивания относится к переменным и методам типа public.
- Имя, перед которым стоит один символ подчеркивания, определяет переменную или метод типа protected. Однако до сих пор это было только декларативное утверждение, не поддерживаемое интерпретатором python. Это удобно для чтения и модификации программы, и только.
- Имя, перед которым стоят два символа подчёркивания относится к типу private. И это поддерживается на уровне интерпретатора. Но есть маленькое исключение: __имя__ — относится к типу public.
Рассмотрим следующий пример.
Результат выполнения программы
100 200
Другими слова наличие одного подчеркивания в начале имени никак не влияет на доступ к переменной (и методу).
Следующий пример относится к переменным типа private.
Результат выполнения программы
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.
Результат выполнения программы
100 200
Мы получаем доступ к закрытому методу, через метод открытый. Вызов же a1.__pri() извне класса невозможен.
Ну и последнее. Всё таки доступ к защищенным переменным методам и переменным получить можно. Дело в том, что переменные и метода типа private получают еще одно имя, по которому к ним можно получить доступ. Если в предыдущем примере после строки
a1 = A(100, 200)
выполнить
dir(a1)
то мы получим имена переменных класса, в том числе альтернативные имена закрытых переменных и методов. Соответственно для закрытых членов класса получим _A__a, _A__b, _A__pri. И тут доступ уже совершенно свободный, например, a1._A__pri(). Не много забавно, для любителей других языков программирования. Не правда ли? Но, на самом деле, это всё дело вкуса, да простят меня приверженцы "чистого" программирования. ;)
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.