公开工厂/插件设计模式的python包

factories的Python项目详细描述


安装

您可以克隆或下载此github repo,或者也可以 通过PIP安装:

pip install factories

概述

factories是一个公开factory/plugin设计模式的模块。这个模式背后的想法是能够定义一个您的功能所在的结构-允许您调用该功能,而不必真正知道它在做什么。

当构建系统时,这种方法特别有用,系统可能会随着时间的推移以未知的方式扩展。示例用例可能包括:

  • 工具箱,其中每个工具都表示为一个插件和一个任意填充这些工具的接口

  • 节点图,我们不知道哪些节点可以使用

  • 数据解析器,其中包括由于不推荐而随时间改变格式的数据,这意味着每种数据类型都可以由一个插件表示,允许框架从不关心数据的存储细节

所有这些结构之间的共同点是,每个系统的核心都需要做一些事情,但不必关心如何完成这项任务的细节。相反,细节保存在插件库中,插件库可以随着时间的推移而扩展和收缩。

这种模式非常有用,但往往会带来编写动态加载机制和功能的开销,以便轻松地交互和查询插件。factories模块的目的是减少这一开销——允许您专注于最终目标和插件的开发。

快速示例

要使用工厂,我们首先需要声明工厂将包含什么。这是一个类,在这个类中,您可以准确地定义应该遵循什么样的功能——将其视为所有插件的基类。

classTool(object):name='unknonw'defactivate(self):returnNonedefabout(self):return''

在本例中,我们将工具定义为一个具有name属性和两个方法的类。现在我们可以举例说明一个工厂给我们的基类。

importfactoriesfactory=factories.Factory(abstract=Tool,plugin_identifier='name',)

请注意,我们给工厂提供了工具类类型-它在搜索时使用此类型来知道要查找什么。我们还给它一个(可选的)标识符,它可以用来从工厂请求特定的插件。

我们现在可以开始添加到工厂的路径。工厂将立即搜索这些位置寻找插件(任何继承自工具cla的类)。

# -- Register with a hard coded pathfactory.add_path('c:/some/plugin/location')# -- Register relativelyfactory.add_path(os.path.join(os.path.dirname(__file__),'our_plugins',),)

我们现在可以开始与工厂进行互动

# -- Perhaps we're dealing with something  obscure, like a # -- UI where we do not know exactly what is needed up front.# -- So we add a button for each toolfortool_nameinfactory.identifiers():ui.addButton(tool_name)# -- In a scenario where we connect the click event to a function# -- which passes the tool namedefbutton_click(button):tool=factory.request(button.text())tool().activate()

在这个例子中,我们的工具箱没有预先定义它包含什么工具,而是使用工厂动态地填充它,并且我们只在用户实际请求激活它的时候实例化这个工具。

更多示例

工厂提供了另外两个例子。它展示了如何使用插件来解析数据,并授权插件决定应该解析什么而不是核心功能。另一个例子是演示如何使用插件来表示“动物园中的动物”。

这些例子分别存在于factories.examples.readerfactories.examples.zoo之下。

测试和稳定性

这个模块附带了一套单元测试,覆盖率达到94%。强烈建议您在进行任何更改之前运行这些测试,并在提出修复或贡献之前再次运行这些测试。

虽然每一个努力都是为了稳定,但考虑到这是一个相对较新的模块,如果您能将任何错误或问题传达给mike@twisted.space

相容性

这已经在python 2.7.13和python 3.6.6下在windows和ubuntu下进行了测试。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何修改打印板?   java Spring批处理JdbcCursorItemReader还是RepositoryItemReader?   java如何在JTable Swing中增加标题列的字体?   java在数组方面遇到问题,导致表达式非法启动   java如何为maven pom的某些部分关闭Eclipse代码格式化程序。xml   java Dropwizard登录代码   java Jersey 2.22:客户端的默认连接超时是多少?   java无法自动连接字段:javax。sql。数据来源   如何从java中的行列表中获取单词列表?   java JDBC批量更新和处理异常?   计算大根:bigdecimal/java   java如何在JavaCC语法中提到trycatch块   javasocket。getInetAddress()不返回任何内容   oracle SQL开发人员错误无法找到Java虚拟机   java我如何计算和显示未来5年每一年的投资价值   java如何关闭浏览器选项卡?   java如何在showMessageDialog中打印双2D数组?   java从站点抓取播放列表URL?   selenium中的java点击css按钮