我正在尝试获取要在另一个模块中使用的对象的动态实现。
可以用作
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):
答案 0 :(得分:0)
您可以使用globals()
动态访问当前模块中的全局对象:
def get_implementation(name):
return globals()[name]
但是来电者可以使用:
getattr(module, name)
而不是
module.get_implementation(name)
相反,如果名称必须是动态的。
如果您使用的是Zope,请考虑将您的课程注册为实用程序;您可以使用getUtility(interface)
或getUtility(interface, name=name)
来查找实现,而不是将您的实现限制在一个模块中,以后可以从任何模块或单独的包中注册这些实用程序。