2017-11-13 6 views
1

私は、その属性の1つがニューラルネットワークを表すと思われるPythonでクラスを開発しています。私はこの属性を実際に別のクラスのインスタンスにしたいと思います。NNという名前のメソッドをいくつか用意しています(例えば、train()、予測のためにpredict()など)。さらに、私はこの属性を初期化する合理的な方法は、引数の1つとしてNNクラスのインスタンスを期待するクラスのコンストラクタを使用することだと考えました。クラスのユーザーに、その属性の1つの予想されるタイプを説明する方法を教えてください。

これを解決する方法について私が最初に考えたのは、インターフェイスを実装し、ユーザーがクラスコンストラクタに提供するものを何でもチェックして、それが期待されるNNクラスのものであることを確認することでした。しかし、どちらのインターフェース(1)も型チェック(2,、45)もPythonの優れた方法ではないようです。

代わりにDuck typingを使用し、オブジェクトメソッドを使用できない(実行時の型チェックを延期する)まで試してみることにします。しかし、私の場合、NNクラスは、いくつかのメソッドと属性を使って、かなり複雑になるかもしれません。私がインターフェースのアイデアを破棄して、クラスのユーザーがオブジェクトに必要なメソッドと属性をすべて提供することを期待している場合、このオブジェクトに対してどのようなことが予想されますか?この情報をクラスdocstring、コンストラクタdocstring、または他の場所に記述する必要がありますか?あるいは、このシナリオを解決する良い方法がありますか?

+0

私はダックタイピングが行く方法だと思います。そうすれば、クラスに渡されたインスタンスに予期したメソッドがない場合を処理するためのコードを書く必要がありません。したがって、あなたの期待を文書化し、それらの期待を単純にする価値があるでしょう:あなたのクラスは、渡されたインスタンスのメソッドを呼び出すだけです。 – quamrana

+0

私の習慣は、ダックタイピングを使用せず、列と予測メソッドを持つ基本クラスですNotImplementedErrorを発生させる –

+0

@quamrana:私はこれに同意すると信じています。しかし、主な問題は次のとおりです。特に予想されるクラスが実質的に複雑な場合。 – JLagana

答えて

0

Python 3.5では、type hintsを使用できます。これにより、予想されるタイプがユーザに記録され、オプションのオフラインタイプのチェックが可能になります。

+0

お時間をありがとう!これを達成するためにタイプヒントを使用する方法の最小限の例を提供できますか?具体的には、クラス全体を指定するためにどのようにタイプヒントを使用しますか?これはクラスのコンストラクタの引数の1つでなければなりません。 – JLagana

1

私は__init__と言います。docstringは、NNオブジェクトが提供される場所なので、入れたい場所です。

何かのように:

""" 
(...) 
:param NN: an object supporting run(), train() and validate() methods 
(...) 
""" 

ここでの利点は、あなたが引数としてを供給することができるということです - 地獄、あなたもクラスが、関数、または変更されたインスタンスではありませんNN引数を書くことができますあなたが正しく動作するものを提供している限り、あなたのニューラルネットワークとしてが動作します。

+0

お時間をありがとう!しかし、これは非常にスケーラブルではないようです。 NNクラスに*複数のメソッドがある場合はどうなりますか?それぞれが何をすべきかについての記述を含めることができますか?これらの関数の期待される引数に加えて、このクラスが持つべきすべての属性を加えます。 NNクラス自体に別の複合クラスのオブジェクトを受け入れるメソッドがある場合はどうなりますか? – JLagana

+0

クラスにネストされたドキュメントストリング(つまり、NNクラスのドキュメント内のNNサブクラスのドキュメント、ベースクラスのコンストラクタのドキュメント内にドキュメント)がありますか?よりよい方法があることを願っています。 – JLagana

+0

明確にするには、あなたが必要としている必要がある方法を文書化するだけです。 NNに500のメソッドがありますが、run()とvalidate()が呼び出す唯一のメソッドが2つある場合、オブジェクトはこれらの2つをサポートする必要があります。 Pythonは動的に型定義されているので、必要なメソッドを呼び出すだけで、エラーが発生しても、定義された名前が必要であることをユーザーに知らせるか、それはあなた自身とデフォルトを指定します。 – jkm

関連する問題