Раздел 45 · Python backend: Тарбадель

Множественное наследование, MRO и super

middle~40 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Квот третий день чинит датчики в западном коллекторе. Датчик у него собран из двух готовых кусков: один пишет журнал, другой помнит последние ответы. Оба куска наследуют общий Device, который при создании регистрирует устройство в сети Подземья. Включаешь один датчик, а в сети появляются два.

class Device:
    def __init__(self):
        print("Device: регистрирую в сети")


class Logged(Device):
    def __init__(self):
        print("Logged: открываю журнал")
        Device.__init__(self)


class Cached(Device):
    def __init__(self):
        print("Cached: завожу кэш")
        Device.__init__(self)


class Sensor(Logged, Cached):
    def __init__(self):
        Logged.__init__(self)
        Cached.__init__(self)


Sensor()
Logged: открываю журнал
Device: регистрирую в сети
Cached: завожу кэш
Device: регистрирую в сети

В прошлом уроке ты видел, как Python ищет атрибут: сначала дескрипторы данных у класса, потом словарь объекта, потом всё остальное у класса. Слово «у класса» там означало «у класса и у его предков по порядку». Пока у каждого класса был один родитель, порядок был прямой линией до object. С двумя родителями линия ветвится, и Python должен выпрямить её сам. Сегодня ты узнаешь, как он это делает, почему super() зовёт не родителя, и соберёшь для арсенала свой singledispatch, который выбирает реализацию по тому же порядку.

урок из курса

Урок из курса «Python backend: Тарбадель». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.