Python 模块依赖注入

Python 模块依赖注入,python,dependency-injection,python-module,Python,Dependency Injection,Python Module,考虑一个模块,例如不同模块在同一解释器过程中使用的某个模块。此模块将具有单个上下文。为了使某些\u模块方法能够工作,它必须接收类实例的依赖项注入 将依赖项注入模块的pythonic和优雅的方式是什么?我认为成熟的依赖项注入和所有行话都更适合静态类型语言,如Java,在python中,您可以非常容易地完成这一点。例如,这里是一个简单的注入 class DefaultLogger(object): def log(self, line): print line _features

考虑一个模块,例如不同模块在同一解释器过程中使用的某个模块。此模块将具有单个上下文。为了使
某些\u模块
方法能够工作,它必须接收类实例的依赖项注入


将依赖项注入模块的pythonic和优雅的方式是什么?

我认为成熟的
依赖项注入
和所有行话都更适合静态类型语言,如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。

使用全局模块

import some_module
some_module.classinstance = MyClass()

某些模块
可以使用代码来设置默认实例(如果未收到),或者只需将
classinstance
设置为
,并在调用方法时进行检查以确保其已设置。

您可以使用来实现您的目标。

这不是依赖项注入,而是一个服务定位器。@deamon可能是它没有,可能两者都是
get\u功能('logger')
是服务定位器,但set\u功能在应用程序开始时注入MyLogger,这是差异之间的良好链接不幸的是,这是一个服务定位器。链接好像死了。@validname修复,谢谢!