Возникнет TypeError из-за неправильного числа аргументов. super() найдёт C.f по MRO, но при вызове передаст экземпляр, а метод C.f объявлен без параметра self.
Что произойдёт при попытке выполнения следующего кода?
Возникнет TypeError из-за неправильного числа аргументов. super() найдёт C.f по MRO, но при вызове передаст экземпляр, а метод C.f объявлен без параметра self.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что произойдёт при попытке выполнения следующего кода?
class C:
def f():
pass
class D:
def f(self):
pass
class E(C,D):
def f(self):
super().f()
E().f()
- Будет вызван метод класса D, поскольку подходящий метод отсутствует в классе C
- Произойдёт ошибка, связанная с отсутствием метода у объекта класса
- Произойдёт ошибка, связанная с попыткой вызвать функцию от списка
- Будет вызван метод класса C
- Произойдёт ошибка, связанная с передачей неправильного числа аргументов
Ответ
Возникнет TypeError из-за неправильного числа аргументов. super() найдёт C.f по MRO, но при вызове передаст экземпляр, а метод C.f объявлен без параметра self.
Порядок разрешения здесь E → C → D → object. Python не пропускает найденный метод из-за неподходящей сигнатуры и не ищет вместо него D.f. Тело C.f не выполнится: ошибка возникает при связывании аргументов вызова. Для обычного метода нужен self; staticmethod имел бы другую семантику.