模块的依赖注入
想象一下,有一个模块,比如说 some_module
,这个模块被其他很多模块在同一个解释器进程中使用。这个模块只有一个上下文。为了让 some_module
里的方法正常工作,它需要接收一个类实例作为依赖注入。
那么,有什么优雅又符合 Python 风格的方法来把这个依赖注入到模块里呢?
3 个回答
0
你可以使用dependencies
这个工具包来实现你的目标。
2
我个人认为,带有所有专业术语的完整的 依赖注入
更适合像 Java 这样的静态类型语言。而在 Python 中,你可以非常简单地实现这一点。例如,这里有一个基本的 注入
示例。
class DefaultLogger(object):
def log(self, line):
print line
_features = {
'logger': DefaultLogger
}
def set_feature(name, feature):
_features[name] = feature
def get_feature(name):
return _features[name]()
class Whatever(object):
def dosomething(self):
feature = get_feature('logger')
for i in range(5):
feature.log("task %s"%i)
if __name__ == "__main__":
class MyLogger(object):
def log(sef, line):
print "Cool",line
set_feature('logger', MyLogger)
Whatever().dosomething()
输出结果:
Cool task 0
Cool task 1
Cool task 2
Cool task 3
Cool task 4
如果你觉得有什么缺失,我们可以很容易地添加,因为这就是 Python 的特点。
3
使用一个模块级的全局变量。
import some_module
some_module.classinstance = MyClass()
some_module
可以写一些代码来设置一个默认的实例,如果没有传入实例的话,或者直接把 classinstance
设置为 None
,然后在调用方法的时候检查一下它是否已经被设置。