17

単純なクラスを想定します。

class MyClass(object):
    pass

.
.
.
m = MyClass
print type(m) # gets: <type 'classobj'>
# if m is classobj, how can i check a variable is class object?

私の質問は、変数がクラスオブジェクトであることを確認するにはどうすればよいですか?

簡単な解決策:

if str(type(m)) == "<type 'classobj'>":
    # do something

しかし、それを確認する古典的な方法が少なくとも1つあると思います。

4

5 に答える 5

39

inspectを使用します。

import inspect
print inspect.isclass(obj)
于 2013-04-05T19:07:15.030 に答える
21

2.x では、クラス オブジェクトはtype(新しいスタイルのクラス) またはclassobj(従来のクラス) にすることができます。タイプはtype組み込みですが、classobjタイプはそうではありません。それで、どうやってそれを手に入れますか?そのためのtypesモジュールです。

isinstance(MyClass, (types.TypeType, types.ClassType))

3.x では、従来のクラスについて心配する必要がないため、次のようになります。

isinstance(MyClass, type)

タイプを直接比較したい場合でも、オブジェクトを.xml で比較しないstrでください。比較:

>>> class MyClassicClass:
...     pass
>>> str(type(MyClassicClass)) == "<type 'classobj'>"
True
>>> str("<type 'classobj'>") == "<type 'classobj'>"
True

ほとんどの場合、オブジェクトを直接比較できます。

>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False

(そして、何らかの理由で文字列表現を実際に比較する必要がある非常にまれなケースでは、reprではなく が必要ですstr。)

于 2013-04-05T19:00:07.827 に答える
8

新しいスタイルのクラス (あなたの例のように明示的に派生しobjectたもの、または Python 3 で暗黙的に派生したもの) は type ではありませんclassobj。古いスタイルのクラスだけがclassobjs です。したがって、記述されている例のクラスについては、すべての新しいスタイルのクラスが次のように、MyClassが のインスタンスであるかどうかを確認するだけで済みます。type

isinstance(MyClass, type)

すべての新しいスタイルのクラスはから派生しているため、次のobjectこともできます。

issubclass(MyClass, object)

私は反対することをお勧めします:

type(MyClass) == type

クラスのタイプがtypeではなく、メタクラスの場合、これは失敗します。もちろん、そのためのユースケースがあるかもしれませんが。

古いスタイルのクラスがあるかどうかを本当に確認する必要がある場合は、typesモジュールをインポートして を使用するtypes.ClassTypeか、古いスタイルのクラスを宣言して、テストしているクラスが同じタイプであるかどうかを確認します。

class OldStyleClass:
   pass
OldStyleClass = type(OldStyleClass)

isinstance(MyClass, OldStyleClass)
于 2013-04-05T19:06:06.047 に答える