Files
Mastering-Python-2e-code_2/CH_08_metaclasses/T_06_automatic_plugin_system.rst
T
2022-05-05 18:25:55 +02:00

40 lines
823 B
ReStructuredText

>>> import abc
>>> class Plugins(abc.ABCMeta):
... plugins = dict()
...
... def __new__(metaclass, name, bases, namespace):
... cls = abc.ABCMeta.__new__(metaclass, name, bases,
... namespace)
... if isinstance(cls.name, str):
... metaclass.plugins[cls.name] = cls
... return cls
...
... @classmethod
... def get(cls, name):
... return cls.plugins[name]
>>> class PluginBase(metaclass=Plugins):
... @property
... @abc.abstractmethod
... def name(self):
... raise NotImplemented()
>>> class PluginA(PluginBase):
... name = 'a'
>>> class PluginB(PluginBase):
... name = 'b'
>>> Plugins.get('a')
<class '...PluginA'>
>>> Plugins.plugins
{'a': <class '...PluginA'>,
'b': <class '...PluginB'>}