init_subclass is called when a class is subclassed. Useful for registration and validation.
1class Plugin:2 _registry = {}34 def __init_subclass__(cls, plugin_name=None, **kwargs):5 super().__init_subclass__(**kwargs)6 name = plugin_name or cls.__name__.lower()7 Plugin._registry[name] = cls89 @classmethod10 def get_plugin(cls, name):11 return cls._registry.get(name)1213class AudioPlugin(Plugin, plugin_name="audio"):14 def process(self):15 return "Processing audio"1617class VideoPlugin(Plugin, plugin_name="video"):18 def process(self):19 return "Processing video"2021print(Plugin._registry)22# {"audio": AudioPlugin, "video": VideoPlugin}2324plugin = Plugin.get_plugin("audio")()25print(plugin.process()) # "Processing audio"
Use cases: