Введение
Для Java внедрение зависимостей работает как чистое ООП, т. Е. Вы предоставляете интерфейс, который будет реализован, и в своем коде фреймворка принимаете экземпляр класса, реализующего определенный интерфейс.
Теперь для Python вы можете сделать то же самое, но я думаю, что в случае с Python этот метод был слишком накладным. Итак, как бы вы реализовали это питоническим способом?
Пример использования
Скажем, это код фреймворка:
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
.
Очевидно, что фреймворк ничего не знает о пользователях или какой-либо другой логике приложения, поэтому клиентский код должен внедрить в фреймворк функциональность получателя пользователя, чтобы аутентификация работала.
AttributeError
илиTypeError
), но в остальном это то же самое.