前書き
Javaの場合、依存性注入は純粋なOOPとして機能します。つまり、実装するインターフェイスを提供し、フレームワークコードで、定義されたインターフェイスを実装するクラスのインスタンスを受け入れます。
これでPythonの場合も同じように実行できますが、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の方法はありますか?それとも、そのような機能をサポートするライブラリはありますか?
更新:具体的な状況
トークンを使用して認証を処理するマイクロWebフレームワークを開発するとします。このフレームワークにはID
、トークンから取得したものを提供し、それに対応するユーザーを取得する関数が必要ですID
。
明らかに、フレームワークはユーザーやその他のアプリケーション固有のロジックについて何も認識していないため、認証を機能させるには、クライアントコードがユーザーゲッター機能をフレームワークに挿入する必要があります。
AttributeError
またはTypeError
が他の方法で発生すると想定します)が、それ以外は同じです。