Напомню про режимы доступа свойств класса:
• public - публичное свойство: - доступно везде
• protected - (с одним подчеркиванием
_attr): для обращения внутри класса и во всех его дочерних классах• private - (с двумя подчеркиваниями
__attr): для обращения только внутри классаПример: сделаем в базовом классе все атрибуты приватными.
class Geom:
name = 'Geom'
def __init__(self, x1, y1, x2, y2):
print(f"инициализатор Geom для {self.__class__}")
self.__x1 = x1
self.__y1 = y1
self.__x2 = x2
self.__y2 = y2
class Rect(Geom):
def __init__(self, x1, y1, x2, y2, fill='red'):
super().__init__(x1, y1, x2, y2)
self.__fill = fill
r = Rect(1, 2, 3 ,4)
print(r.__dict__)
Получим вот такой вывод (хммм): создавали один класс, а там почему-то переменные из другого класса:
{'_Geom__x1': 1, '_Geom__y1': 2, '_Geom__x2': 3, '_Geom__y2': 4, '_Rect__fill': 'red'}Мало того, если даже добавим метод для получения этих координат в классе Rect, то всё равно ничего не получится — будет ошибка:
def get_coords(self):
return (self.__x1, self.__y1)
print(r.get_coords()) # # AttributeError: 'Rect' object has no attribute '_Rect__x1'
Однако если мы переместим этот метод в БАЗОВЫЙ класс, то всё отработает как хотелось бы.
Такое поведение потому, что privat-атрибуты доступны только внутри того класса, где объявлены. Собственно для этого они и создавались.
А если хотим получать доступ к ним в дочерних классах, то уменьшаем количество подчёркиваний на одну. Всё просто)
Protected-атрибуты фактически не запрещает обращаться вне класса. Это условности, которые напоминает, чтобы не обращались к этому атрибуту в другом месте. Не для тебя его роза цвела.😅
ываыаа
Тоже самое касается и приватных методов:
def __verify_coord(self, coord):
return 0 <= coord <= 100
Их можно использовать только внутри текущего класса. Если попытаетесь в другом месте — ошибка отсутствия метода.
Можно еще попробовать другой вариант обхода - в дочернем классе вызывать через super() метод базового класса:
super().__verify_coord(x1)
Но нет.. .Так тоже не получиться схитрить и ловим ошибку: ``AttributeError: 'super' object has no attribute '_Rect__verify_coord'``
💬 Вопрос к вам:
А вам вообще интересно, полезно про это читать? Может я зря стараюсь и напрягаюсь?
Практически не вижу реакций под такими постами 😔😔😔
Дайте знать в комментах — нужен фидбек!
👇 Как вам такой формат?!
🔥 — Полезно, продолжай!
🤔 — Есть вопросы /предложения или темы для следующих постов.