在Python中动态返回类实现

时间:2014-03-09 12:18:15

标签: python oop

我正在尝试获取要在另一个模块中使用的对象的动态实现。

可以用作

  • get_implementation('Implementation1')
  • get_implementation('Implementation2')

目的是拥有一个可以轻松扩展的可维护代码 - 例如,我可以添加另一个名为Implementation3的类,并在不更改核心功能的情况下使其工作。

这是一个好方法还是任何建议?

get_implementation(name):
   if name:
      return getattr(name)

class Base()
    def __init__(self, args1, arg2, arg3, arg4....):

class Implementation1()
    def __init__(self, *args):

class Implementation2()
    def __init__(self, *args):
  • 这是一个好方法还是我有更好的选择?
  • 这是针对Zope框架的 - 我是否需要选择任何可以执行此操作的API?

1 个答案:

答案 0 :(得分:0)

您可以使用globals()动态访问当前模块中的全局对象:

def get_implementation(name):
    return globals()[name]

但是来电者可以使用:

getattr(module, name)

而不是

module.get_implementation(name)

相反,如果名称必须是动态的。

如果您使用的是Zope,请考虑将您的课程注册为实用程序;您可以使用getUtility(interface)getUtility(interface, name=name)来查找实现,而不是将您的实现限制在一个模块中,以后可以从任何模块或单独的包中注册这些实用程序。