Доброго времени суток, читатели, зрители моего канала programmer's notes.
Теперь в Дзен есть Подборки. Данная статья относится к подборке
Приложение к видео
Наследование и множественное наследование
Вспоминаем нюансы наследования
Множественное наследование, это когда класс сразу наследует от нескольких других классов. Но обратимся в начале к цепочке наследований то, что мы уже рассматривали.
Но вспомнить старое совсем даже не мешает. Тем более, что множественное наследование, как оказывается сводится к тому, что мы уже знаем.
Результат выполнения программы
A
B
C
Здесь, благодаря использованию функции super() выполняются все конструкторы классов. Но чтобы глубже заглянуть в наследование придётся поэкспериментировать с представленной выше программой. К сожалению Дзен, не предоставляет пока иного представления программы, как картинки. И так
Результат выполнения программы
C
Здесь нет вызова вышестоящего класса, поэтому выполняется только конструктор класс C.
Результат выполнения программы
A
B
Интерпретатор языка Python, видя, что в классе C нет конструктора переходит выше по цепочке вверх, и выполняет конструктор класса B, а функция super() обеспечивает вызов конструктора класса A.
Следующий пример
Результат выполнения программы
A
Интерпретатор Python идёт вверх по цепочке наследования и находит конструктор только в классе A.
И наконец последний пример нашей серии экспериментов
Результат выполнения программы
A
C
Функция поднимается по цепочке наследования в поисках конструктора. В класса B его нет, тогда функция поднимается выше на уровень и находит конструктор в класса A.
Кстати, наверное, у вас возникает вопрос: а что будет, если конструктора не будет и в классе? Не забывайте, что у нас есть ещё и не видимый (не обозначенный в программе) класс object.
Множественное наследование
В действительности множественное наследование сводится в конечном счёте к тем примерам, которые мы рассмотрели выше.
Рассмотрим простейший пример множественного наследования
Запись типа class С(B, A): и есть множественное наследование. В скобках можно перечислить произвольное количество наследуемых классов.
Результат выполнения программы
Класс B
И вполне можно было бы догадаться, что так и будет. В двух наследуемых классах имена методов совпадают. Должен же интерпретатор как-то выходить из этого положения. Да, в некоторых языках подобная ситуация могла бы вызвать ошибку. Но Python решает эту проблему вот так.
Но согласитесь, что это очень похоже на цепочку наследования, о которой мы говорили выше: класс C наследует от B, а B наследует от A. При этом метод класса B переопределяет (заменяет) метод своего родителя A. Если же мы хотим, чтобы сработал и метод класса A, то используем всё ту же функцию: super().getf().
Следующий пример совсем прост, здесь никаких коллизий.
Результат работы программы
Класс A
Класс B
И здесь это понятно. Класс C унаследовал методы от классов A и B.
И наконец последний пример
Результат выполнения программы
A
B
200
Поясним некоторые важные, по нашему мнению, моменты.
Наследование. как вы уже поняли, идёт слева направо по списку множественного наследования. Значит класс A в иерархии находится ниже класса B. А это значит, что super().__init__() вызывает конструктор класса B. Ну, а далее всё, я надеюсь, понятно.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.