В предыдущем видео мы рассмотрели, как работает наследование
и множественное наследование в классах Python.
Как я уже говорил, если создать достаточно большую иерархию классов
и использовать множественное наследование, а также
большое количество классов-примесей, то итоговый код
может показаться очень сложным,
и его будет очень трудно читать программисту
и разбираться, как он работает,
что делает его менее выразительным.
В Python существует альтернативный подход наследованию — это композиция.
В этом видео мы с вами на примере разберем,
как работает композиция, и вы сможете сравнить,
какой из подходов вам больше нравится — наследование или композиция.
Давайте немного вспомним
классы из предыдущего видео.
У нас был класс "питомец", мы от него унаследовали класс "собачку" (класс Dog).
Затем мы захотели, чтобы наши объекты классов
"собака" могли выполнять экспорт данных,
и мы ввели класс-примесь ExportJSON.
После этого наш финальный класс ExDog использовал
множественное наследование и наследовался от класса "собачка"
и ExportJSON,
тем самым он решал все наши задачи.
Давайте представим, что нам понадобится экспортировать данные
не только в формате json, но и еще в другом формате,
например, пусть будет это XML.
Как тогда изменится структура нашей программы?
Тогда, очевидно, нам нужно будет добавить еще один класс-примесь,
и тогда наш код будет выглядеть так, как показано на слайде,
то есть пока не вдаемся в подробности реализации
самих классов-примесей.
У нас появился наш новый класс-примесь ExportXML,
у него есть свой собственный метод to_xml,
и наш итоговый класс ExDog теперь наследуется уже от трех
классов-родителей.
Тем самым объекты этого класса ExDog
смогут экспортировать данные как в json, так и в xml.
Давайте представим, что нам нужно будет добавлять еще
несколько методов для экспорта данных.
Какие сложности могут возникнуть в таком случае?
Во-первых, нам постоянно придется изменять код нашего класса ExDog,
постоянно дописывать туда новые классы-примеси.
Во-вторых, это уже сильно усложнит сам код,
и в итоговой программе нам нужно будет вызывать разные методы
этих классов-примесей, то есть мы будем постоянно
что-то изменять в своей программе.
И это уже не то, чего хотелось бы нам достичь.
Давайте попробуем
рассмотреть, как в таком случае работает композиция.
Для этого нам понадобится
Jupyter Notebook.
Давайте попробуем решить эту задачу немного другим способом.
Предположим, у нас будет класс для экспорта.
Давайте объявим его.
Пусть он будет называться PetExport
и у него будет один метод, export.