如何检查变量是否是类?

我想知道如何检查一个变量是否是一个类(不是一个实例!)

我已经尝试使用isinstance(object, class_or_type_or_tuple)函数来做到这一点,但我不知道一个类将具有什么类型。

例如,在下面的代码中

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

我尝试用???替换“class”,但我意识到class是python中的关键字。

249240 次浏览
>>> class X(object):
...     pass
...
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True

更好的方法是使用inspect.isclass函数。

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


>>> x = X()
>>> isinstance(x, X)
True
>>> inspect.isclass(x)
False

类Foo:称为旧样式类,类X(对象):称为新样式类。

检查这个Python中的旧样式类和新样式类有什么区别?。推荐新款式。阅读“统一类型和类

isinstance(X, type)

如果X是类则返回True,如果不是则返回False

检查。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))

这里已经有了一些可行的解决方案,但这里还有一个:

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True
最简单的方法是在投票最多的答案中使用inspect.isclass 实现细节可以在python2检查python3检查中找到 isinstance(object, type)
对于旧式类:isinstance(object, types.ClassType)
em,对于旧式类,它使用types.ClassType,下面是types.py的代码:

class _C:
def _m(self): pass
ClassType = type(_C)

此检查与Python 2兼容。3.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
Benjamin Peterson关于inspect.isclass()的使用是正确的。 但请注意,你可以使用内置函数issubclass测试Class对象是否是特定的Class,因此是隐式的Class。 根据您的用例,这可能更python化
from typing import Type, Any
def isclass(cl: Type[Any]):
try:
return issubclass(cl, cl)
except TypeError:
return False

然后可以这样使用:

>>> class X():
...     pass
...
>>> isclass(X)
True
>>> isclass(X())
False

还有另一种检查方法:

import inspect


class cls():
print(None)


inspect.isclass(cls)

参考:https://www.kite.com/python/docs/inspect.isclass

好吧,inspect.isclass不是为我工作,相反,试试这个

class foo:
pass


var = foo()


if str(type(var)).split(".")[0] == "<class '__main__":
print("this is a class")
else:
print(str(type(var)).split(".")[0])

所以基本上,type(var)就是<class 'a type'>

< p >例子:<class 'int' 但是,当var是一个类时,它将出现类似<class '__main__.classname'>

这样的东西

因此,我们将字符串拆分为<class '__main__,并使用if进行比较,如果字符串完全匹配,则它是一个类

enter image description here

在某些情况下(取决于你的系统),一个简单的测试是看看你的变量是否有__module__属性。

if getattr(my_variable,'__module__', None):
print(my_variable, ".__module__ is ",my_variable.__module__)
else:
print(my_variable,' has no __module__.')

Int, float, dict, list, STR等没有__module__