Узор не спал всю ночь. Журнал сети Подземья он вывел на стену рядом с ромбами и обвёл две строки: записи о классах 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.