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

jee*_*ngk 216 python reflection

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

我已经尝试使用该函数isinstance(object, class_or_type_or_tuple)来执行此操作,但我不知道类将具有什么类型.

例如,在以下代码中

class Foo: pass  
isinstance(Foo, **???**) # i want to make this return True.
Run Code Online (Sandbox Code Playgroud)

我试图取代" class"与??? ,但我意识到这class是python中的关键字.

Ben*_*son 301

更好的是:使用该inspect.isclass功能.

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

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False
Run Code Online (Sandbox Code Playgroud)

  • 比什么更好:)? (8认同)
  • 如果要检查的对象是*类实例*,如果你还想`inspect.isclass`返回'True`,请使用`inspect.isclass(type(Myclass()))` (7认同)
  • 截至撰写本文时,在 python 标准库的 [`inspect.py`](https://github.com/python/cpython/blob/7f01f77f8fabcfd7ddb5d99f12d6fc99af9af384/Lib/inspect.py#L191) 模块中, `isclass( object)` 函数是一个单行函数:`return isinstance(object, type)`。 (7认同)
  • @michaelmeyer`type(whatever)`总是返回一个类的对象,所以这个检查是多余的.如果没有,就没有办法实例化`whatever`,因此你无法在第一时间执行检查. (6认同)
  • 那是因为`snakemake.util`是一个模块而不是一个类? (2认同)
  • 确实,“inspect.isclass”在 Python 2 中更有用,因为在 Python 2 中需要担心新旧样式的类。也许该函数剩下的一个优点是意图非常明确。 (2认同)

and*_*tti 41

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))
Run Code Online (Sandbox Code Playgroud)

  • Python 3中不再需要`types.ClassType`(并被删除). (13认同)
  • 记得`import types` (5认同)
  • 这是 Python 2 实现,它必须处理旧式和新式类。Python 3 将其简化为“isinstance(object, type)”。请注意,像“int”、“list”、“str”等对象**也是**类,因此您不能使用它来区分*Python中定义的自定义类*和*定义的内置类在 C 代码中*。 (5认同)
  • 这根本不适用于新样式的类......即使在 python 2 中也是如此。不要单独使用这个解决方案 (3认同)
  • 不要将你的参数称为“对象”。这掩盖了突出的内置名称“object”。 (2认同)

S.L*_*ott 34

>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
Run Code Online (Sandbox Code Playgroud)

  • 这是提示 - 因为这适用于新式类,所以不要使用旧式类.使用旧式课程毫无意义. (12认同)
  • 顺便说一句,Python 3 中的所有类都是新样式的 - 没有 classobj,因此这比仅仅为了检查变量是否为类而导入检查要好。 (6认同)
  • 它不适用于旧式类:`'class Old:pass''isinstance(Old,type)== False'`,但`inspect.isclass(Old)== True`. (5认同)
  • @jeeyoungk:您不是“假设差异来自……”,您实际上是在代码中阅读。对象的子类(“新样式”)具有所需的属性,这正是您在此处看到的。 (2认同)
  • 如果你的 X 类有一个元类,这将不起作用。如果它有元类,那么将返回元类而不是类型。 (2认同)

小智 21

isinstance(X, type)
Run Code Online (Sandbox Code Playgroud)

True如果X是上课False则返回,如果不是.

  • 这是Python 3的正确答案 (9认同)
  • 这仅适用于新样式类.旧式类的类型为"classobj".因此,如果您使用旧样式类,则可以执行以下操作:import types isinstance(X,types.ClassType) (6认同)
  • 我得到假,即使X是一个班级. (3认同)
  • 这似乎与[`S相同 Lott的回答`](/sf/answers/27701901/),比他大四岁. (2认同)

Ser*_*gey 6

此检查与 Python 2.x 和 Python 3.x 兼容。

import six
isinstance(obj, six.class_types)
Run Code Online (Sandbox Code Playgroud)

这基本上是一个包装函数,它执行与 andrea_crotti 答案中相同的检查。

例子:

>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False
Run Code Online (Sandbox Code Playgroud)