Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251578
  • 博文数量: 62
  • 博客积分: 1547
  • 博客等级: 上尉
  • 技术积分: 672
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 23:46
个人简介

music,code,dialog,rest

文章分类

全部博文(62)

文章存档

2020年(2)

2019年(6)

2018年(4)

2017年(5)

2016年(20)

2015年(4)

2014年(2)

2013年(1)

2012年(1)

2011年(1)

2010年(1)

2009年(2)

2007年(10)

2006年(3)

分类: 架构设计与优化

2016-07-31 11:58:37

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
阅读(891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~