Как проверить, является ли переменная классом или нет? - PullRequest
201 голосов
/ 28 декабря 2008

Мне было интересно, как проверить, является ли переменная классом (не экземпляром!) Или нет.

Я пытался использовать функцию isinstance(object, class_or_type_or_tuple) для этого, но я не знаю, какой тип будет иметь класс.

Например, в следующем коде

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

Я пытался заменить "class" на ??? , но понял, что class - это ключевое слово в python.

Ответы [ 8 ]

280 голосов
/ 28 декабря 2008

Еще лучше: используйте функцию inspect.isclass.

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

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False
40 голосов
/ 12 апреля 2012

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))
33 голосов
/ 28 декабря 2008
>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
21 голосов
/ 06 апреля 2012
isinstance(X, type)

Возвращает True, если X является классом, а False, если нет.

2 голосов
/ 22 ноября 2018

Эта проверка совместима как с Python 2.x, так и с Python 3.x.

import six
isinstance(obj, six.class_types)

Это в основном функция-обертка, которая выполняет ту же проверку, что и в ответе andrea_crotti.

Пример:

>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False
1 голос
/ 30 мая 2018

Самый простой способ - использовать 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 голос
/ 28 декабря 2008

класс Foo: называется классом старого стиля, а класс X (объект): называется классом нового стиля.

Проверьте это В чем разница между старым и новым стилем классов в Python? . Новый стиль рекомендуется. Читайте о " объединяющих типах и классах "

0 голосов
/ 24 июня 2012

Здесь уже есть некоторые рабочие решения, но вот еще одно:

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...