Инъекция зависимостей в модули - PullRequest
5 голосов
/ 24 июня 2011

Рассмотрим модуль, например some_module, что различные модули используют в одном и том же процессе интерпретатора. Этот модуль будет иметь единый контекст. Чтобы методы some_module работали, он должен получить инъекцию зависимостей экземпляра класса.

Каким будет питонский и элегантный способ внедрения зависимости в модуль?

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Использовать модуль global.

import some_module
some_module.classinstance = MyClass()

some_module может иметь код для установки экземпляра по умолчанию, если он не получен, или просто установить classinstance в None и убедиться, что он установлен при вызове методов.

2 голосов
/ 24 июня 2011

ИМХо мнение, полноценное Dependency Injection со всем жаргоном лучше подходит для статически типизированных языков, таких как Java, в python вы можете сделать это очень легко, например, здесь есть голая кость injection

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

Если вы считаете, что чего-то не хватает, мы можем легко это добавить, его питон.

0 голосов
/ 10 октября 2016

Вы можете использовать пакет dependencies для достижения своей цели.

...