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

我尝试使用函数isinstance(对象,class_or_type_or_tuple)来做到这一点,但我不知道一个类会有什么类型。

例如,在下面的代码中

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

我试着用“阶级”来代替??,但我意识到class是python中的关键字。


当前回答

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

其他回答

>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True

此检查与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

还有另一种检查方法:

import inspect

class cls():
     print(None)

inspect.isclass(cls)

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

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

在某些情况下(取决于你的系统),一个简单的测试是看看你的变量是否有__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__