Einführung
Für Java funktioniert Dependency Injection als reines OOP, dh Sie stellen eine zu implementierende Schnittstelle bereit und akzeptieren in Ihrem Framework-Code eine Instanz einer Klasse, die die definierte Schnittstelle implementiert.
Für Python können Sie jetzt auf die gleiche Weise vorgehen, aber ich denke, diese Methode war im Fall von Python zu viel Aufwand. Wie würden Sie es dann auf pythonische Weise implementieren?
Anwendungsfall
Angenommen, dies ist der Framework-Code:
class FrameworkClass():
def __init__(self, ...):
...
def do_the_job(self, ...):
# some stuff
# depending on some external function
Der grundlegende Ansatz
Der naivste (und vielleicht der beste?) Weg besteht darin, zu verlangen, dass die externe Funktion in den FrameworkClass
Konstruktor eingegeben und dann von der do_the_job
Methode aufgerufen wird.
Rahmencode:
class FrameworkClass():
def __init__(self, func):
self.func = func
def do_the_job(self, ...):
# some stuff
self.func(...)
Kundencode:
def my_func():
# my implementation
framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)
Frage
Die Frage ist kurz. Gibt es eine besser verwendete pythonische Methode, um dies zu tun? Oder vielleicht Bibliotheken, die solche Funktionen unterstützen?
UPDATE: Konkrete Situation
Stellen Sie sich vor, ich entwickle ein Micro-Web-Framework, das die Authentifizierung mithilfe von Token übernimmt. Dieses Framework benötigt eine Funktion, um einige ID
vom Token erhaltene zu liefern und den Benutzer entsprechend zu erhalten ID
.
Offensichtlich weiß das Framework nichts über Benutzer oder eine andere anwendungsspezifische Logik, daher muss der Client-Code die User-Getter-Funktionalität in das Framework einfügen, damit die Authentifizierung funktioniert.
AttributeError
oderTypeError
anderweitig ausgelöst wird), aber ansonsten ist es dasselbe.