私は、その属性の1つがニューラルネットワークを表すと思われるPythonでクラスを開発しています。私はこの属性を実際に別のクラスのインスタンスにしたいと思います。NN
という名前のメソッドをいくつか用意しています(例えば、train()
、予測のためにpredict()
など)。さらに、私はこの属性を初期化する合理的な方法は、引数の1つとしてNN
クラスのインスタンスを期待するクラスのコンストラクタを使用することだと考えました。クラスのユーザーに、その属性の1つの予想されるタイプを説明する方法を教えてください。
これを解決する方法について私が最初に考えたのは、インターフェイスを実装し、ユーザーがクラスコンストラクタに提供するものを何でもチェックして、それが期待されるNN
クラスのものであることを確認することでした。しかし、どちらのインターフェース(1)も型チェック(2,、4、5)もPythonの優れた方法ではないようです。
代わりにDuck typingを使用し、オブジェクトメソッドを使用できない(実行時の型チェックを延期する)まで試してみることにします。しかし、私の場合、NN
クラスは、いくつかのメソッドと属性を使って、かなり複雑になるかもしれません。私がインターフェースのアイデアを破棄して、クラスのユーザーがオブジェクトに必要なメソッドと属性をすべて提供することを期待している場合、このオブジェクトに対してどのようなことが予想されますか?この情報をクラスdocstring、コンストラクタdocstring、または他の場所に記述する必要がありますか?あるいは、このシナリオを解決する良い方法がありますか?
私はダックタイピングが行く方法だと思います。そうすれば、クラスに渡されたインスタンスに予期したメソッドがない場合を処理するためのコードを書く必要がありません。したがって、あなたの期待を文書化し、それらの期待を単純にする価値があるでしょう:あなたのクラスは、渡されたインスタンスのメソッドを呼び出すだけです。 – quamrana
私の習慣は、ダックタイピングを使用せず、列と予測メソッドを持つ基本クラスですNotImplementedErrorを発生させる –
@quamrana:私はこれに同意すると信じています。しかし、主な問題は次のとおりです。特に予想されるクラスが実質的に複雑な場合。 – JLagana