如何检查变量是否是一个类?

时间:2008-12-28 03:08:06

标签: python reflection

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

我尝试使用函数isinstance(object, class_or_type_or_tuple)来执行此操作,但我不知道类会有什么类型。

例如,在以下代码中

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

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

10 个答案:

答案 0 :(得分:279)

更好:使用inspect.isclass功能。

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

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False

答案 1 :(得分:40)

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))

答案 2 :(得分:32)

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

答案 3 :(得分:21)

isinstance(X, type)

如果True是班级,则返回X,否则返回False

答案 4 :(得分:2)

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

答案 5 :(得分:2)

本杰明·彼得森(Benjamin Peterson)对这项工作使用inspect.isclass()是正确的。 但是请注意,您可以使用内置函数issubclass测试Class对象是否是特定的Class,并因此隐式地Class。 根据您的用例,这可能更像pythonic。

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

答案 6 :(得分:1)

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

检查What is the difference between old style and new style classes in Python?。建议使用新款式。阅读“unifying types and classes

答案 7 :(得分:1)

最简单的方法是使用最常投票答案中公布的inspect.isclass 可以在python2 inspectpython3 inspect找到实施细节 对于新式课程:isinstance(object, type)
对于旧式课程:isinstance(object, types.ClassType)
em,对于旧式类,它使用types.ClassType,这是来自types.py的代码:

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

答案 8 :(得分:0)

有另一种检查方法:

    asgiref==3.3.1
    astroid==2.5
    autopep8==1.5.6
    beautifulsoup4==4.9.3
    bs4==0.0.1
    certifi==2020.12.5
    chardet==4.0.0
    click==7.1.2
    colorama==0.4.4
    Django==3.0.4
    Flask==1.0.2
    Flask-Login==0.5.0
    Flask-SQLAlchemy==2.5.1
    greenlet==1.0.0
    gunicorn==20.1.0
    html5lib==1.1
    idna==2.10
    isort==5.7.0
    itsdangerous==1.1.0
    Jinja2==2.11.3
    joblib==1.0.1
    lazy-object-proxy==1.5.2
    MarkupSafe==1.1.1
    mccabe==0.6.1
    MouseInfo==0.1.3
    numpy==1.20.1
    Pillow==8.2.0
    PyAutoGUI==0.9.52
    pycodestyle==2.7.0
    PyGetWindow==0.0.9
    pylint==2.7.0
    PyMsgBox==1.0.9
    pyperclip==1.8.2
    PyRect==0.1.4
    PyScreeze==0.1.27
    PyTweening==1.0.3
    pytz==2021.1
    pywhatkit==4.7
    requests==2.25.1
    scikit-learn==0.24.2
    scipy==1.6.2
    six==1.15.0
    sklearn==0.0
    soupsieve==2.2.1
    SQLAlchemy==1.4.12
    sqlparse==0.4.1
    threadpoolctl==2.1.0
    toml==0.10.2
    urllib3==1.26.4
    webencodings==0.5.1
    Werkzeug==1.0.1
    wikipedia==1.4.0
    wrapt==1.12.1

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

答案 9 :(得分:-2)

这里已经有了一些有效的解决方案,但这是另一个:

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True