モジュールのインポーターによって提供される関数を使用するモジュールを作成できますか?
いくつかの重要な関数の実装を指定せずに、ジェネリックコードを記述したいと思います。ユーザーに指定してもらいたい。これらをすべての関数への入力として含めることができますが、これは醜いようです。
オブジェクトを作成する場合は、抽象クラスを作成します。モジュールに相当するものはありますか?
編集:クラスのメソッドではなく、モジュールの関数でこれを行う方法について具体的に質問しています。
モジュールにモンキーパッチを適用し、実行時にモジュールに新しい関数を追加することができます。
import my_module
def my_implementation():
pass
my_module.implementation = my_implementation
ただし、これはPythonコミュニティでは嫌われています。これはこのモジュールのすべてのユーザーに影響するため、本質的に不安定です。たとえば、モンキーパッチを適用したモジュールを使用する別のモジュールを使用する場合、他のモジュールはデバッグが難しい不安定な動作を示す可能性があります。
あなたがやりたいことのために、あなたは抽象クラスを作成したほうがいいです:-)
モジュールでそれを行う場合、いつか同じプログラムで、あるモジュールが実装で汎用モジュールを使用し、別のモジュールが別のモジュールでそれを使用したい場合に問題が発生します。
解決策は、必要なサービスを提供するクラスを主に含むモジュールを作成することです。
たとえば、「ランダム」モジュールを見てください。「randint」、「uniform」、「gauss」などのすべてのモジュール関数は、実際にはrandom.Randomクラスの非表示インスタンスのメソッドにバインドされています。ただし、Randomクラスの独自のインスタンスを使用することも、いくつかの主要なメソッドを再定義してランダムの生成方法を変更することでサブクラス化することもできますが、すべての有用なメソッドは保持します。