Вызовите явно Ancestor.start на экземпляре с именем 'bob'. Исходный Child('Bob') ничего не печатает, а обычный bob.start() выбрал бы Parent1.start по MRO.
Исправление поведения наследования в Python
Вызовите явно Ancestor.start на экземпляре с именем 'bob'. Исходный Child('Bob') ничего не печатает, а обычный bob.start() выбрал бы Parent1.start по MRO.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется откорректировать работу программы так, чтобы при её выполнении в консоль выводилась строка Ancestor bob: start.
class Ancestor:
def __init__(self, name):
self.name = name
def start(self):
print(f"Ancestor {self.name}: start")
def rewind(self):
print(f"Ancestor {self.name}: rewind")
class Parent1(Ancestor):
def start(self):
print(f"Parent1 {self.name}: start")
def open(self):
print(f"Parent1 {self.name}: open")
class Parent2(Ancestor):
def start(self):
super().start()
print(f"Parent2 {self.name}: start")
def open(self):
print(f"Parent2 {self.name}: open")
def close(self):
print(f"Parent2 {self.name}: close")
def flush(self):
print(f"Parent2 {self.name}: flush")
class Child(Parent1, Parent2):
def flush(self):
print(f"Child {self.name}: flush")
bob = Child("Bob")
Ответ
Вызовите явно Ancestor.start на экземпляре с именем 'bob'. Исходный Child('Bob') ничего не печатает, а обычный bob.start() выбрал бы Parent1.start по MRO.
Минимальное решение для точного требуемого текста:
bob = Child('bob')
Ancestor.start(bob)
# Ancestor bob: start
Регистр имени важен: с 'Bob' строка тоже содержала бы заглавную B. Если нужно изменить именно поведение Child.start, определите в Child метод, вызывающий Ancestor.start(self). Это намеренно обходит промежуточные реализации. Обычный super() из Child пойдёт в Parent1, а Parent2.start дополнительно печатает собственную строку, поэтому не даёт только требуемый вывод.