Вступ
Для Java Dependency Injection працює як чистий ООП, тобто ви надаєте інтерфейс, який має бути реалізований, і у своєму коді фреймворку приймаєте екземпляр класу, який реалізує визначений інтерфейс.
Що стосується 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(...)
Питання
Питання коротке. Чи існує кращий, загальновживаний пітонічний спосіб зробити це? А може, якісь бібліотеки, що підтримують таку функціональність?
ОНОВЛЕННЯ: Конкретна ситуація
Уявіть, я розробляю мікро-веб-фреймворк, який обробляє аутентифікацію за допомогою маркерів. Цей фреймворк потребує функції, щоб забезпечити частину ID
отриманого з маркера та отримати відповідного йому користувачаID
.
Очевидно, що фреймворк нічого не знає про користувачів або будь-яку іншу логіку, специфічну для додатка, тому клієнтський код повинен вводити в фреймворк функцію отримання користувача, щоб автентифікація працювала.
AttributeError
абоTypeError
піднімається інакше), але в іншому випадку це те саме.