如何使用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

我的要求是,我有一个标准框架,可以分3步将HTML生成为PDF:

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

2) 使用预处理的数据创建HTML模板-呈现模板

3) 运行一个HTML到PDF的转换程序,并将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

  • 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是复杂的事情。明天有人想把这个简单的东西移植到另一种语言!