Мне было интересно, как проверить, является ли переменная классом (не экземпляром!) Или нет.
Я пытался использовать функцию, isinstance(object, class_or_type_or_tuple)
чтобы сделать это, но я не знаю, какой тип будет иметь класс.
Например, в следующем коде
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
Я пытался заменить " class
" с ??? , но я понял, что class
это ключевое слово в Python.
python
reflection
jeeyoungk
источник
источник
inspect.isclass
вернуть,True
если объект для проверки является экземпляром класса , используйтеinspect.isclass(type(Myclass()))
type(whatever)
всегда возвращает объект, который является классом, поэтому эта проверка избыточна. Если этого не произойдет, не будет никакого способа создать экземпляр,whatever
и, таким образом, вы не сможете выполнить проверку в первую очередь.type(snakemake.utils)
возвращает<class 'module'>
и все жеinspect.isclass(snakemake.utils)
возвращаетFalse
.snakemake.util
что модуль не класс?Inspect.isclass, вероятно, лучшее решение, и действительно легко увидеть, как оно на самом деле реализовано.
источник
import types
types.ClassType
больше не требуется в Python 3 (и удаляется).In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
isinstance(object, type)
. Обратите внимание , что объекты , такие какint
,list
,str
и т.д., также классы, так что вы не можете использовать это , чтобы различать пользовательские классы , определенные в Python и встроенных классов , определенных в коде C .источник
'class Old:pass' 'isinstance(Old, type) == False'
ноinspect.isclass(Old) == True
.Вернуть,
True
еслиX
это класс, аFalse
если нет.источник
S. Lott's answer
, что на четыре года старше.Эта проверка совместима как с Python 2.x, так и с Python 3.x.
По сути, это функция-обертка, которая выполняет ту же проверку, что и в ответе andrea_crotti.
Пример:
источник
класс Foo: называется классом старого стиля, а класс X (объект): называется классом нового стиля.
Проверьте это В чем разница между старым стилем и новым стилем классов в Python? , Новый стиль рекомендуется. Читайте о " объединении типов и классов "
источник
Простейшим способом является использование в том
inspect.isclass
виде, в каком оно опубликовано в наиболее проголосовавшем ответе.Подробности реализации можно найти на python2 inspect и python3 inspect .
для класса нового стиля:
isinstance(object, type)
для класса старого стиля:
isinstance(object, types.ClassType)
em, для класса старого стиля, который он использует
types.ClassType
, вот код из types.py :источник
Бенджамин Петерсон прав насчет использования
inspect.isclass()
для этой работы. Но обратите внимание, что вы можете проверить, является лиClass
объектClass
и, следовательно, неявным образом aClass
, используя встроенную функцию issubclass . В зависимости от вашего варианта использования это может быть более питонным.Затем можно использовать так:
источник
Здесь уже есть некоторые рабочие решения, но вот еще одно:
источник
types.ClassType
был удален в Python 3