Выбор ответа Senior ООП и dataclasses обновлено

Регистрация подклассов без метакласса

Вопрос

Как проще всего автоматически регистрировать все подклассы Plugin в словаре без метакласса?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Определить initsubclass(cls, kw) в Plugin. initsubclass (Python 3.6+) вызывается у родителя при создании каждого подкласса и получает новый класс.

Варианты ответа

  1. Переопределить __new__ в Plugin и регистрировать там
  2. Определить __init_subclass__(cls, **kw) в Pluginправильный ответ
  3. Переопределить __init__ в Plugin
  4. Использовать @staticmethod register в каждом наследнике

Разбор

__init_subclass__ (Python 3.6+) вызывается у родителя при создании каждого подкласса и получает новый класс. Это закрывает типичную задачу метаклассов: регистрация, проверка атрибутов. __new__ и __init__ срабатывают при создании экземпляров, а не классов. Статический метод пришлось бы вызывать вручную.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме