0

だから私はこのようなクラスを持っています:

 class Encoder(object):

     movie = None

     def __init__(self, movie_instance):
         self.movie = movie_instance

     def encode_profile_hd(self):
         print "profile 1"

     def encode_profile_sd(self):
         print "profile 2"

コンストラクターに渡されるmovie_instance引数がMovieクラスでなければならないことを指定するにはどうすればよいですか?

私は試した:

def __init__(self, Movie movie_instance):

しかし、それはうまくいきません。これが明らかな場合は申し訳ありません。

4

5 に答える 5

4

Pythonは通常、ダックタイピングに依存しています。関数の入力パラメーターを人為的に制限すると、コードの柔軟性が低下するため、これは不適切なスタイルと見なされます。要件を明確に文書化するだけで、パラメーターが要件に準拠していない場合でも、コードは失敗します。

于 2012-06-28T14:41:12.050 に答える
3

あなたはisinstanceそのために使うことができます。

def __init__(self,movie_instance):
    if(not isinstance(movie_instance, Movie)):
         raise ValueError("movie_instance must be an instance of class Movie")

これは、Movieインスタンスだけでなく、から継承するすべてのものに対して機能しますMovie

多くの人がPythonではこのイディオムを頻繁に使用すべきではないと言うことは注目に値します。何かが映画のように見え、映画のようなにおいがし(映画には香りがありますか?)、映画のように再生される場合、それを映画のように扱ってみませんか?(つまり、映画のようにオブジェクトを使用して、機能しない場合に発生する例外を処理するようにしてください)。

于 2012-06-28T14:35:26.073 に答える
1

Pythonは動的型付け言語であるため、静的型付け言語のように変数の型を事前に宣言することはできません。

于 2012-06-28T14:38:05.717 に答える
0

コンストラクターはそうではありませ__init____new____del__さらに、これはデストラクタではないことに注意してください。

Pythonの哲学は、ダックタイピング(ABCを使用しない限り)です。つまり、アヒルとして振る舞うことができ、アヒルのように偽医療を行うことができるものはすべて、アヒルである可能性があります。

明示的に型チェックはデータオブジェクトモデルに対して行われるため、特定の状況がない限り、避ける必要があります。

于 2012-06-28T14:46:35.537 に答える
0

あなたはそれをしたくありません。あなたがすべきことはあなたの機能の要件を文書化することです。このようにして、必要な属性を実装している限り、誰かが別のクラスを作成し、それを関数の引数として使用できます。

この例はイテレータです。__iter__()またはnext()関数を持つ任意のオブジェクトをイテレータとして使用できます。他の例はファイルオブジェクトです。ファイルの属性を持つ任意のオブジェクトは、関数のパラメーターでファイルとして使用できます。StringIOはそのようなオブジェクトの例です。

于 2012-06-28T14:49:14.287 に答える