带有自定义类的插件

在 Python 3.6 中, PEP 487 添加了 __init_subclass__ 特殊方法,它简化并扩展了类定制,而不使用元类 。因此,此功能允许创建简单的插件 。在这里,我们通过修改先前的示例来演示此功能 :

Python 3.x >= 3.6

class Base:
    plugins = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.plugins.append(cls)
    
    def test(self):
        print("Base.")

class PluginA(Base):
    def test(self):
        super().test()
        print("Plugin A.")
    

class PluginB(Base):
    def test(self):
        super().test()
        print("Plugin B.")

结果:

PluginA().test()
# Base.
# Plugin A.

PluginB().test()
# Base.
# Plugin B.

Base.plugins
# [__main__.PluginA, __main__.PluginB]