Что такое наследование в Python
Что проверяют
Знаете ли вы механизм и понимаете ли, что в Python оно нужно реже, чем в статически типизированных языках.
Как отвечать
Наследование позволяет классу получить атрибуты и методы другого класса, переопределив нужные. Объявляется указанием базовых классов в скобках, обращение к реализации предка идёт через специальную функцию.
Особенности Python:
- множественное наследование разрешено, порядок поиска определяется линеаризацией;
- все классы наследуют общий корневой тип;
- проверка принадлежности типу учитывает всю иерархию.
Ключевая мысль, которую стоит проговорить: в Python наследование нужно реже, чем в языках со статической типизацией. Там оно часто требовалось ради полиморфизма: чтобы объект подошёл функции, он обязан быть нужного типа. Здесь работает утиная типизация: подходит любой объект с нужными методами, независимо от происхождения. Значит наследование ради «чтобы подошло по типу» просто не нужно.
Остаются два осмысленных применения: переиспользование реализации и объявление контракта через абстрактный базовый класс.
Про переиспользование стоит сразу сказать про его цену: наследник зависит не от контракта родителя, а от того, как родитель написан внутри. Правка базового класса ломает наследников неожиданным образом. Поэтому предпочтительна композиция: объект содержит другой объект и делегирует ему работу. Связь получается явной и заменяемой.
Типичная удачная форма это примеси: маленькие классы, добавляющие одно конкретное поведение и не имеющие своего состояния.
Полезно упомянуть современную альтернативу контрактам через наследование: протоколы, описывающие требуемый набор методов без обязательного наследования. Чужой класс из библиотеки нельзя заставить наследоваться, а протоколу он может соответствовать автоматически.
Где спотыкаются
Строят глубокие иерархии вместо композиции.
Наследуются ради полиморфизма, забывая про утиную типизацию.
Не вызывают инициализацию предка и получают недособранный объект.
Кладут в базовый класс состояние, которое нужно не всем наследникам.