mock_sobes
← Python — Internals
senior correct_vs_wrong #195
Нужно автоматически регистрировать все подклассы `Plugin` в реестре. Два варианта — какой современный и почему?
Вариант 1
# Через метакласс — классический подход до 3.6
PLUGINS = {}

class PluginMeta(type):
    def __init__(cls, name, bases, namespace):
        super().__init__(name, bases, namespace)
        if name != "Plugin":
            PLUGINS[name.lower()] = cls

class Plugin(metaclass=PluginMeta):
    pass

class JsonPlugin(Plugin):
    pass
# PLUGINS == {"jsonplugin": JsonPlugin}
Вариант 2
# Через __init_subclass__ — Python 3.6+
PLUGINS = {}

class Plugin:
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        PLUGINS[cls.__name__.lower()] = cls

class JsonPlugin(Plugin):
    pass
Чтобы решить вопрос и сохранить попытку — войди.