1

我的要求是我有一个标准框架,可以通过 3 个步骤生成 HTML 到 PDF:

1)从我们的数据库中获取内容并从中创建含义,读取 XML 并覆盖或决定设置等 -预处理

2) 使用预处理数据创建 HTML 模板 - render_template

3)运行 aa HTML to PDF Converted 并取回 PDF。-调用服务

现在 , 有时 可能 需要 不同 的 PDF 引擎 并且 实现 可能 会 改变 ... 其中 甚至 有 可能 需要 非常 严格 的 数据 或 专有 设置

所以我可能需要扩展 1覆盖 2覆盖 3并且我想让这个实现可配置并轻松切换。

我正在考虑创建一个基类,然后创建实际上将成为运行时对象的 Foo.py 实现和 Bar.py 实现。我怎样才能用简单的 Python 得到这个?

我能想到的一个可怕的方法是:

#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

  • 基础.py
  • foo.py
  • 酒吧.py
  • unknown.py 应该很容易扩展。
4

1 回答 1

1

我会做这样的事情:

# 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

根据需要定义后端(使用抽象类或鸭子类型)。

这绝不是一个完整的解决方案,而是我在几个项目中看到并完成的骨架模式。您可能想要添加注册表机制、默认后端、自动发现... ymmv。

像 django 这样的项目做了很多多后端的东西,看看他们的代码库。

于 2014-03-08T00:03:41.287 回答