Wprowadzenie
W przypadku języka Java Dependency Injection działa jako czysty OOP, tj. Udostępniasz interfejs do zaimplementowania, aw kodzie struktury akceptujesz instancję klasy, która implementuje zdefiniowany interfejs.
Teraz w przypadku Pythona możesz zrobić to samo, ale myślę, że ta metoda była zbyt dużym narzutem w przypadku Pythona. Jak więc zaimplementowałbyś to w Pythonie?
Przypadek użycia
Powiedz, że to jest kod ramowy:
class FrameworkClass():
def __init__(self, ...):
...
def do_the_job(self, ...):
# some stuff
# depending on some external function
Podejście podstawowe
Najbardziej naiwnym (a może najlepszym?) Sposobem jest wymaganie, aby funkcja zewnętrzna została dostarczona do FrameworkClass
konstruktora, a następnie wywoływana z do_the_job
metody.
Kod ramowy:
class FrameworkClass():
def __init__(self, func):
self.func = func
def do_the_job(self, ...):
# some stuff
self.func(...)
Kod klienta:
def my_func():
# my implementation
framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)
Pytanie
Pytanie jest krótkie. Czy istnieje lepszy, powszechnie używany sposób w Pythonie, aby to zrobić? A może biblioteki obsługujące taką funkcjonalność?
AKTUALIZACJA: konkretna sytuacja
Wyobraź sobie, że tworzę mikro framework sieciowy, który obsługuje uwierzytelnianie za pomocą tokenów. Ta struktura wymaga funkcji, która będzie dostarczać część ID
uzyskaną z tokenu i pobierać użytkownika odpowiadającego temu ID
.
Oczywiście framework nie wie nic o użytkownikach ani żadnej innej logice specyficznej dla aplikacji, więc kod klienta musi wstrzyknąć do frameworka funkcję pobierającą użytkownika, aby uwierzytelnianie działało.
AttributeError
inaczejTypeError
zostanie podniesiony lub), ale poza tym jest tak samo.