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 FrameworkClasskonstruktora, a następnie wywoływana z do_the_jobmetody.
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ęść IDuzyskaną 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.
AttributeErrorinaczejTypeErrorzostanie podniesiony lub), ale poza tym jest tak samo.