2012-05-05 12 views
8

は、私は、オブジェクトがクラスのリスト/グループ内の任意のクラスのインスタンスであるかどうかを確認したいのですが、継承を複数のクラスと比較するにはどうすればよいですか?

if isinstance(obj, Class1) or isinstance(obj, Class2) ... or isinstance(obj, ClassN): 
    # proceed with some logic 

私が意味を行わずそうするのも、神託の方法がある場合、私は見つけることができませんクラスごとにクラスを比較します。

isinstanceのようないくつかの関数を使用して、それが存在する場合でも比較するn個のクラスを受け取る可能性が高くなります。

ご協力いただきありがとうございます。 :)

+4

「help(isinstance)」は、SOに投稿する時間よりも難しいですか? o_0 – rantanplan

+0

タイプ/クラスのチェックは[一般的にはお勧めできません](http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in​​-python)。ダックタイピングと 'try' /' except'はより良い方法です。 – yentsun

答えて

25

第2引数としてクラスのタプルをisinstanceに渡すことができます。ドキュメンテーション文字列を見上げる

>>> isinstance(u'hello', (basestring, str, unicode)) 
True 

は、そのかかわらず、あなたに言っただろう;)

>>> help(isinstance) 
Help on built-in function isinstance in module __builtin__: 

isinstance(...) 
    isinstance(object, class-or-type-or-tuple) -> bool 

    Return whether an object is an instance of a class or of a subclass thereof. 
    With a type as second argument, return whether that is the object's type. 
    The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for 
    isinstance(x, A) or isinstance(x, B) or ... (etc.). 
+0

isinstance(x、A)とisinstance(x、B)はどうですか?それを行う簡単な方法はありますか? –

2

isinstance(obj, (Class1, Class2, ..., ClassN))、またはisinstance(obj, BaseClass)彼らは共通の祖先を持っている場合。

つまり、これを使用する前に2度考えてください。このような明示的な型チェックは、コードの一般性を損なう可能性があるので、アヒルの入力を捨てる理由がある方がよいでしょう。

-1

しかし、サブクラスチェックせずに、それを行うための別の方法:

>>> obj = Class2() 
>>> type(obj) in (Class1, Class2, Class3) 
True 

注意。おそらくこれは実際の使用ではなく、考慮に入れたものです。

+0

同じではありません。 'isinstance'のようなサブクラスは考慮しません。 –

+0

@CatPlusPlus私はそのことをメモします – yentsun

+1

@yentsunまた古いスタイルのクラスではうまくいきません。 'class A:pass'と' class B:pass'インスタンスは同じタイプの ''を持ち、そのテストに失敗します。 –

関連する問題