init_subclass runs when a class is subclassed. Used for registration and validation.
1class Plugin:2 _plugins = {}34 def __init_subclass__(cls, plugin_name=None, **kwargs):5 super().__init_subclass__(**kwargs)6 name = plugin_name or cls.__name__.lower()7 Plugin._plugins[name] = cls89 @classmethod10 def get(cls, name):11 return cls._plugins[name]1213class TextPlugin(Plugin, plugin_name="text"):14 def process(self, data):15 return str(data)1617class JsonPlugin(Plugin, plugin_name="json"):18 def process(self, data):19 import json20 return json.dumps(data)2122# Auto-registration23print(Plugin._plugins)24# {"text": TextPlugin, "json": JsonPlugin}2526plugin = Plugin.get("json")()27print(plugin.process({"key": "value"}))
Use cases: