ユーザーの機能を呼び出すためのインターフェイスを提供することで、自分のモジュールのユーザーがその機能を拡張する機能を提供したいと考えています。たとえば、クラスのインスタンスが作成されたときに通知を受け、インスタンスを使用する前にそのインスタンスを変更する機会をユーザーに与えたいとします。Pythonでフックやコールバックを実装するのに好ましい方法は何ですか?
私はそれがインスタンス化を行うモジュールレベルのファクトリ関数を宣言することです実装しました方法:私はのmymoduleにクラスのインスタンスを必要とするとき
# in mymodule.py
def factory(cls, *args, **kwargs):
return cls(*args, **kwargs)
はその後、私はむしろcls(arg1, arg2)
よりfactory(cls, arg1, arg2)
を行います。プログラマが別のモジュールにこのような関数を記述し、それを拡張するために
:上記のコールバックの
def myFactory(cls, *args, **kwargs):
instance = myFactory.chain(cls, *args, **kwargs)
# do something with the instance here if desired
return instance
インストールは次のようになります。
myFactory.chain, mymodule.factory = mymodule.factory, myFactory
これは私には十分に簡単なようで、 Pythonプログラマーとして、代入で関数をコールするのではなく、コールバックを登録する関数があると期待していたのか、他のメソッドがあれば期待していたのでしょうか?私のソリューションは実用的で、慣用的で、あなたには明らかですか?
私はできるだけシンプルにしていきたいと考えています。私は、ほとんどのアプリケーションが実際には複数のユーザーコールバックをチェーン化する必要があるとは思わない(例えば、無制限の連鎖は上記のパターンで "無料"になる)。コールバックを削除したり、優先順位や順序を指定する必要があるかどうかは疑問です。 python-callbacksやPyDispatcherのようなモジュールは、私には過剰な、特に後者のように思えますが、私のモジュールで作業しているプログラマーにとって魅力的な利点があるならば、私はそれらを公開しています。
単純なサブクラスを使用してクラスを拡張すると何が問題になりますか?なぜこのすべての混乱のコールバック事業ですか? –