Код напечатает 5, 16 и −1 на отдельных строках. Каждый переопределённый calculate() вызывает следующую реализацию по MRO через super(), после чего добавляет свою часть вычисления.
class C:
Код напечатает 5, 16 и −1 на отдельных строках. Каждый переопределённый calculate() вызывает следующую реализацию по MRO через super(), после чего добавляет свою часть вычисления.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
class C: def init(self, x): self.x = x
def calculate(self):
return self.x * 2 + 1
class A(C): def init(self, x, y): super().init(x) self.y = y
def calculate(self):
return super().calculate() + self.y
class B(A): def init(self, x, y, z): super().init(x, y) self.z = z
def calculate(self):
return self.z - super().calculate()
a = C(2) b = A(4, 7) c = B(1, 3, 5)
print(a.calculate()) print(b.calculate()) print(c.calculate())
Ответ
Код напечатает 5, 16 и −1 на отдельных строках. Каждый переопределённый calculate() вызывает следующую реализацию по MRO через super(), после чего добавляет свою часть вычисления.
Для a = C(2): 2 × 2 + 1 = 5. Для b = A(4, 7): метод C даёт 9, затем A добавляет 7 и получает 16. Для c = B(1, 3, 5): C даёт 3, A добавляет 3 и получает 6, после чего B вычисляет 5 − 6 = −1. Конструкторы также проходят по цепочке super(), поэтому нужные поля x, y и z установлены на одном объекте c.