Выбор ответа Senior ООП и dataclasses обновлено
Регистрация подклассов без метакласса
Вопрос
Как проще всего автоматически регистрировать все подклассы Plugin в словаре без метакласса?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Определить initsubclass(cls, kw) в Plugin. initsubclass (Python 3.6+) вызывается у родителя при создании каждого подкласса и получает новый класс.
Варианты ответа
- Переопределить
__new__вPluginи регистрировать там - Определить
__init_subclass__(cls, **kw)вPluginправильный ответ - Переопределить
__init__вPlugin - Использовать
@staticmethod registerв каждом наследнике
Разбор
__init_subclass__ (Python 3.6+) вызывается у родителя при создании каждого подкласса и получает новый класс. Это закрывает типичную задачу метаклассов: регистрация, проверка атрибутов. __new__ и __init__ срабатывают при создании экземпляров, а не классов. Статический метод пришлось бы вызывать вручную.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.