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

ООП на Python. Множественное наследование. Приложение к видеоуроку 11

Оглавление

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

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

ООП в Python
programmer's notes

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

Наследование и множественное наследование

Вспоминаем нюансы наследования

Множественное наследование, это когда класс сразу наследует от нескольких других классов. Но обратимся в начале к цепочке наследований то, что мы уже рассматривали.

Но вспомнить старое совсем даже не мешает. Тем более, что множественное наследование, как оказывается сводится к тому, что мы уже знаем.

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

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

A
B
C

Здесь, благодаря использованию функции super() выполняются все конструкторы классов. Но чтобы глубже заглянуть в наследование придётся поэкспериментировать с представленной выше программой. К сожалению Дзен, не предоставляет пока иного представления программы, как картинки. И так

Выполняется только конструктор класса C
Выполняется только конструктор класса C

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

C

Здесь нет вызова вышестоящего класса, поэтому выполняется только конструктор класс C.

У класса C нет конструктора
У класса C нет конструктора

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

A
B

Интерпретатор языка Python, видя, что в классе C нет конструктора переходит выше по цепочке вверх, и выполняет конструктор класса B, а функция super() обеспечивает вызов конструктора класса A.

Следующий пример

Конструктор есть только у класса A
Конструктор есть только у класса A

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

A

Интерпретатор Python идёт вверх по цепочке наследования и находит конструктор только в классе A.

И наконец последний пример нашей серии экспериментов

Особенности работы функции super()
Особенности работы функции super()

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

A
C

Функция поднимается по цепочке наследования в поисках конструктора. В класса B его нет, тогда функция поднимается выше на уровень и находит конструктор в класса A.

Кстати, наверное, у вас возникает вопрос: а что будет, если конструктора не будет и в классе? Не забывайте, что у нас есть ещё и не видимый (не обозначенный в программе) класс object.

Множественное наследование

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

Рассмотрим простейший пример множественного наследования

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

Запись типа class С(B, A): и есть множественное наследование. В скобках можно перечислить произвольное количество наследуемых классов.

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

Класс B

И вполне можно было бы догадаться, что так и будет. В двух наследуемых классах имена методов совпадают. Должен же интерпретатор как-то выходить из этого положения. Да, в некоторых языках подобная ситуация могла бы вызвать ошибку. Но Python решает эту проблему вот так.

Но согласитесь, что это очень похоже на цепочку наследования, о которой мы говорили выше: класс C наследует от B, а B наследует от A. При этом метод класса B переопределяет (заменяет) метод своего родителя A. Если же мы хотим, чтобы сработал и метод класса A, то используем всё ту же функцию: super().getf().

Следующий пример совсем прост, здесь никаких коллизий.

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

Результат работы программы

Класс A
Класс B

И здесь это понятно. Класс C унаследовал методы от классов A и B.

И наконец последний пример

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

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

A
B
200

Поясним некоторые важные, по нашему мнению, моменты.

Наследование. как вы уже поняли, идёт слева направо по списку множественного наследования. Значит класс A в иерархии находится ниже класса B. А это значит, что super().__init__() вызывает конструктор класса B. Ну, а далее всё, я надеюсь, понятно.

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

Программируйте с нами, программируйте как мы, программируйте лучше нас ;)
Программируйте с нами, программируйте как мы, программируйте лучше нас ;)