我想知道如何检查一个变量是否是一个类(不是一个实例!)
我尝试使用函数isinstance(对象,class_or_type_or_tuple)来做到这一点,但我不知道一个类会有什么类型。
例如,在下面的代码中
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
我试着用“阶级”来代替??,但我意识到class是python中的关键字。
我想知道如何检查一个变量是否是一个类(不是一个实例!)
我尝试使用函数isinstance(对象,class_or_type_or_tuple)来做到这一点,但我不知道一个类会有什么类型。
例如,在下面的代码中
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
我试着用“阶级”来代替??,但我意识到class是python中的关键字。
当前回答
isinstance(X, type)
如果X是类,则返回True,否则返回False。
其他回答
isinstance(X, type)
如果X是类,则返回True,否则返回False。
在某些情况下(取决于你的系统),一个简单的测试是看看你的变量是否有__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__
最简单的方法是使用inspect。是类张贴在投票最多的答案。 实现细节可以在python2 inspect和python3 inspect中找到。 对于new-style类:isinstance(object, type) 对于旧式类:isinstance(object, types.ClassType) 对于老式的类,它使用类型。下面是types.py的代码:
class _C:
def _m(self): pass
ClassType = type(_C)
检查。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))
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