Выбор ответа Senior ООП и dataclasses обновлено

Что на самом деле вызывает super()

Вопрос

Что вызывает super().greet() внутри метода класса B, если объект создан из D(B, C), где B и C наследуют A?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: C.greet: следующий класс после B в MRO объекта D. super() ищет метод в MRO типа объекта, начиная с класса, следующего за текущим.

Варианты ответа

  1. A.greet: прямой родитель B
  2. C.greet: следующий класс после B в MRO объекта Dправильный ответ
  3. D.greet: класс самого объекта
  4. Все методы greet родителей по очереди

Разбор

super() ищет метод в MRO типа объекта, начиная с класса, следующего за текущим. Для экземпляра D порядок D, B, C, A, поэтому из B попадём в C, хотя C не родитель B. Так кооперативное наследование вызывает каждый метод ромба ровно один раз. Автоматического вызова всех родителей нет: цепочка идёт, только если каждый метод сам вызывает super().

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме