如何使用Python实现运行时对象(不同的)实现
我的要求是,我有一个标准框架,可以分3步将HTML生成为PDF: 1) 从我们的数据库中获取内容,并从中创造意义,阅读XML并覆盖或决定设置等-预处理 2) 使用预处理的数据创建HTML模板-呈现模板 3) 运行一个HTML到PDF的转换程序,并将PDF返回。-调用服务 现在,有时可能需要不同的PDF引擎,实现可能会发生变化。。。甚至有可能其中一些需要非常严格的数据或专有设置 因此,我可能需要扩展1,覆盖2,覆盖3,并且我希望使此实现可配置且易于切换 我正在考虑创建一个基类,然后创建Foo.py实现和Bar.py实现,它们实际上将成为运行时对象。如何使用简单的Python实现这一点 我能想到的一个可怕的方式是:如何使用Python实现运行时对象(不同的)实现,python,interface,dependency-injection,plugin-architecture,Python,Interface,Dependency Injection,Plugin Architecture,我的要求是,我有一个标准框架,可以分3步将HTML生成为PDF: 1) 从我们的数据库中获取内容,并从中创造意义,阅读XML并覆盖或决定设置等-预处理 2) 使用预处理的数据创建HTML模板-呈现模板 3) 运行一个HTML到PDF的转换程序,并将PDF返回。-调用服务 现在,有时可能需要不同的PDF引擎,实现可能会发生变化。。。甚至有可能其中一些需要非常严格的数据或专有设置 因此,我可能需要扩展1,覆盖2,覆盖3,并且我希望使此实现可配置且易于切换 我正在考虑创建一个基类,然后创建Foo.py
#Module Name ServiceHandler
def implementation(imp_name):
try:
from imp_name import imp_class
return imp_class(AbtractClass)
else:
Sorry No Implemenation Found!
class AbstractClass(...)
def __init__
Gets invoked in another object method as
self.ServiceHandler.implementation(read_from_xml)
有人能给我一些解决这个问题的好建议吗?基本上我想要Foo(Base)或Bar(Base),这应该像读取配置并将其映射到该配置一样
我当前的模块布局是:
模块.py
- base.py
- 福比
- 巴比
- unknown.py应该易于扩展
- 我会这样做:
# file : service_handler.py
from importlib import import_module
# get parameters from your config file beforehand
def get_backend(backend_name, **kwargs):
# example : foo.Spam gets backend Spam from module foo
backend_module, backend_class = backend_name.rsplit('.', 1)
mdl = import_module(backend_module)
cls = getattr(mdl, backend_class)
return cls(**kwargs) # create the object
根据需要定义后端(使用抽象类或duck类型)
这决不是一个完整的解决方案,而是我在几个项目中看到并完成的一个框架模式。您可能需要添加注册表机制、默认后端、自动发现。。。ymmv
像django这样的项目做了很多后端工作,让他们的代码库看一看。所以你正在尝试研究框架选项,没有纯python我不确定我是否正确理解了你的评论:上面的代码片段是纯python,没有外部依赖性。我不是说你应该使用一个框架,但是你可以看看他们是如何做的。框架通常都有非常健壮的、傻瓜式的和文档化的功能实现,阅读它们的源代码有很多经验。正确。我将从框架代码中寻找灵感!你是对的,很多框架都这样做了。上面的看起来也不错。导入模块很有趣。我们使用Zope,我不想使用zcml是复杂的事情。明天有人想把这个简单的东西移植到另一种语言!