init_subclass auto-registers subclasses in a plugin system.
1class Plugin:2 _registry = {}34 def __init_subclass__(cls, name=None, **kwargs):5 super().__init_subclass__(**kwargs)6 plugin_name = name or cls.__name__.lower()7 Plugin._registry[plugin_name] = cls89 @classmethod10 def get_plugin(cls, name):11 return cls._registry.get(name)1213 @classmethod14 def list_plugins(cls):15 return list(cls._registry.keys())1617# Plugins auto-register18class JSONPlugin(Plugin, name="json"):19 def serialize(self, data):20 import json21 return json.dumps(data)2223class XMLPlugin(Plugin, name="xml"):24 def serialize(self, data):25 # XML serialization26 pass2728class CSVPlugin(Plugin, name="csv"):29 def serialize(self, data):30 # CSV serialization31 pass3233# Usage34print(Plugin.list_plugins()) # ["json", "xml", "csv"]3536plugin = Plugin.get_plugin("json")()37print(plugin.serialize({"key": "value"}))
Benefits: