python的插件架构
是非常灵活的处理在各种场景中,隔离和适应需求变化的利器。

Python 插件架构中,如何动态的对当前支持的plugin类进行获取。
本来已经设计好一个 plugins的子目录,只要在这个子目录中的文件都会自动扫描进入模块。
但是这设计,和setuptools有不兼容的问题。对于egg的包,扫描子目录文件是不太可能了。

准备转入pkg_resource前, 先找了取巧的方法。

就是按父类判断,一个父类下面有多少子类。
在子类中,添加内置注册类,里面包含生成plugins子类实例的方法。该方法中携带该类生成的必要条件和探测逻辑。

这样,可以通过下列方式获得当前总的子类列表。
定义baseclassname

class foo(object): pass
class b1(foo): pass
class b2(foo): pass
class b3(b1): pass

baseclassname='foo'
print ([cls.__name__ for cls in globals()[baseclassname].__subclasses__()])
['b1', 'b2']
baseclassname='b1' 
print ([cls.__name__ for cls in globals()[baseclassname].__subclasses__()])
['b3']
使用这个方法,识别可用的插件类,并加载每个plugin的注册对象到Plugins全局插件对象注册字典中。
该字典中,一个记录有一个键值对,就是对象的名称和插件注册对象的实例引用。
通过插件父类的信息检索,可以动态获得当前加载的插件的名称和数量,并更新全局插件字典。
每个plugin的注册对象,包含有对该plugin的适用条件和规则,和相应的动态生成plugins功能对象的方法。
然后再通过静态工厂方法,根据注册对象的条件,生成对应的插件功能对象实例。
主模块,实现胶水的功能,完成上层应用,根据不同条件返回下层具体功能实例,让上层调用者使用通用的接口完成对应的功能。
zenith 
2016/07/31
10-04 21:18