変数がクラス(インスタンスではない!)であるかどうかを確認する方法を疑問に思っていました。
これを行うために関数isinstance(object, class_or_type_or_Tuple)
を使用しようとしましたが、クラスがどのタイプになるのかわかりません。
たとえば、次のコードでは
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
「class
」を???に置き換えようとしましたが、class
はPythonのキーワードであることに気付きました。
さらに良い: inspect.isclass
関数を使用します。
>>> import inspect
>>> class X(object):
... pass
...
>>> inspect.isclass(X)
True
>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False
Inspect.isclassはおそらく最良のソリューションであり、実際にどのように実装されているかを見るのは本当に簡単です
def isclass(object):
"""Return true if the object is a class.
Class objects provide these attributes:
__doc__ documentation string
__module__ name of module in which this class was defined"""
return isinstance(object, (type, types.ClassType))
>>> class X(object):
... pass
...
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
isinstance(X, type)
True
がクラスの場合はX
を返し、そうでない場合はFalse
を返します。
このチェックは、Python 2.xとPython 3.xの両方と互換性があります。
import six
isinstance(obj, six.class_types)
これは基本的に、andrea_crotti answerと同じチェックを実行するラッパー関数です。
例:
>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False
クラスFoo:は古いスタイルクラスと呼ばれ、クラスX(オブジェクト):は新しいスタイルクラスと呼ばれます。
これを確認してください Pythonの古いスタイルクラスと新しいスタイルクラスの違いは何ですか? 新しいスタイルをお勧めします。 「 型とクラスを統合する 」について読む
最も簡単な方法は、最も投票された回答に掲載されているinspect.isclass
を使用することです。
実装の詳細は python2 inspect および python3 inspect にあります。
新しいスタイルのクラスの場合:isinstance(object, type)
古いスタイルのクラスの場合:isinstance(object, types.ClassType)
em、古いスタイルのクラスでは、types.ClassType
を使用しています。これは types.py のコードです。
class _C:
def _m(self): pass
ClassType = type(_C)