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

Метаклассы, __init_subclass__, декораторы классов

middle~40 мин

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

Узор не спал всю ночь. Журнал сети Подземья он вывел на стену рядом с ромбами и обвёл две строки: записи о классах Ghost и Knock появились в реестре в ту же секунду, когда скрипт Призрака их объявил. В самом скрипте нет ни одного вызова «зарегистрируй». Зато в первых строках есть вот это:

SEEN = {}


class Registering(type):
    def __new__(meta, name, bases, namespace):
        cls = super().__new__(meta, name, bases, namespace)
        SEEN[name] = cls
        return cls


class Ghost(metaclass=Registering):
    pass


class Knock(Ghost):
    pass


print(SEEN)
print(type(Knock))
{'Ghost': <class '__main__.Ghost'>, 'Knock': <class '__main__.Knock'>}
<class '__main__.Registering'>

В прошлом уроке ты видел, что MRO считается в момент выполнения оператора class. Значит, у рождения класса есть момент, и в этот момент что-то работает. Сегодня ты узнаешь, кто рождает классы, как вмешаться в их рождение тремя способами разной силы, и почему для реестра Призрака хватило бы самого слабого.

урок из курса

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

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