web-dev-qa-db-ja.com

変数がクラスであるかどうかを確認する方法は?

変数がクラス(インスタンスではない!)であるかどうかを確認する方法を疑問に思っていました。

これを行うために関数isinstance(object, class_or_type_or_Tuple)を使用しようとしましたが、クラスがどのタイプになるのかわかりません。

たとえば、次のコードでは

class Foo: pass  
isinstance(Foo, **???**) # i want to make this return True.

class」を???に置き換えようとしましたが、classはPythonのキーワードであることに気付きました。

207
jeeyoungk

さらに良い: inspect.isclass 関数を使用します。

>>> import inspect
>>> class X(object):
...     pass
... 
>>> inspect.isclass(X)
True

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False
286

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))
40
andrea_crotti
>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
34
S.Lott
isinstance(X, type)

Trueがクラスの場合はXを返し、そうでない場合はFalseを返します。

21
qnub

このチェックは、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
3
Sergey

クラスFoo:は古いスタイルクラスと呼ばれ、クラスX(オブジェクト):は新しいスタイルクラスと呼ばれます。

これを確認してください Pythonの古いスタイルクラスと新しいスタイルクラスの違いは何ですか? 新しいスタイルをお勧めします。 「 型とクラスを統合する 」について読む

1
JV.

最も簡単な方法は、最も投票された回答に掲載されている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)
1
lyu.l