【问题标题】:How do I implement run time objects (different) implementation with using Python如何使用 Python 实现运行时对象(不同)实现
【发布时间】:2014-04-11 08:17:14
【问题描述】:

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

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

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

3) 运行一个 HTML to PDF Converted 并取回 PDF。 - invoke_service

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

所以我可能需要 extend 1over-ride 2over-ride 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
  • foo.py
  • bar.py
  • unknown.py 应该易于扩展。

【问题讨论】:

    标签: python interface dependency-injection plugin-architecture


    【解决方案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 这样的项目做了很多多后端的东西,看看他们的代码库。

    【讨论】:

    • 所以你正在尝试查看框架选项而不是纯 python
    • 我不确定我是否正确理解了您的评论:上面的 sn-p 是纯 python,没有外部依赖项。我不是说你应该使用一个框架,而是你可以看看他们是如何做事的。框架通常具有相当健壮、万无一失和记录在案的功能实现,阅读它们的源代码可以获得很多经验。
    • 正确。我将查看框架代码以获取灵感!你是对的很多框架已经做到了。上面看起来也不错。 import_module 很有趣。我们使用 Zope 而我不想使用 zcml 是复杂的事情。明天有人想将这个简单的东西迁移到另一种语言!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多