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