模块的依赖注入

5 投票
3 回答
3720 浏览
提问于 2025-04-16 20:13

想象一下,有一个模块,比如说 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,然后在调用方法的时候检查一下它是否已经被设置。

撰写回答