Что такое Pythonic путь к Внедрению зависимости?

Введение

Для Java Внедрение зависимости работает чистым ООП, т.е. Вы обеспечиваете интерфейс, который будет реализован, и в Вашей платформе код принимает экземпляр класса, который реализует определенный интерфейс.

Теперь для Python, Вы можете сделать тот же путь, но я думаю, что метод был слишком большим служебным правом в случае Python. Таким образом, как Вы реализовали бы его в Pythonic путь?

Вариант использования

Скажите, что это - код платформы:

class FrameworkClass():
    def __init__(self, ...):
        ...

    def do_the_job(self, ...):
        # some stuff
        # depending on some external function

Основной подход

Самое наивное (и возможно лучшее?) путь состоит в том, чтобы потребовать, чтобы внешняя функция была предоставлена в FrameworkClass конструктор, и затем быть вызванным от do_the_job метод.

Код платформы:

class FrameworkClass():
    def __init__(self, func):
        self.func = func

    def do_the_job(self, ...):
        # some stuff
        self.func(...)

Клиентский код:

def my_func():
    # my implementation

framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)

Вопрос

Вопрос короток. Есть ли какой-либо лучший наиболее часто используемый Pythonic способ сделать это? Или возможно какие-либо библиотеки, поддерживающие такую функциональность?

ОБНОВЛЕНИЕ: конкретная ситуация

Предположите, что я разрабатываю микро веб-платформу, которая обрабатывает аутентификацию с помощью маркеров. Этой платформе нужна функция для предоставления некоторых ID полученный из маркера и получают пользователя, соответствующего этому ID.

Очевидно, платформа ничего не знает о пользователях или любой другой специализированной логике, таким образом, клиентский код должен ввести пользовательскую функциональность метода считывания в платформу, чтобы заставить аутентификацию работать.

62
задан 9 August 2015 в 12:32

1 ответ

Существует также Pinject, инжектор зависимости от Python с открытым исходным кодом Google.

Вот пример

>>> class OuterClass(object):
...     def __init__(self, inner_class):
...         self.inner_class = inner_class
...
>>> class InnerClass(object):
...     def __init__(self):
...         self.forty_two = 42
...
>>> obj_graph = pinject.new_object_graph()
>>> outer_class = obj_graph.provide(OuterClass)
>>> print outer_class.inner_class.forty_two
42

, И вот исходный код

0
ответ дан 31 October 2019 в 14:24

Другие вопросы по тегам:

Похожие вопросы: