17

假设一个简单的类:

class MyClass(object):
    pass

.
.
.
m = MyClass
print type(m) # gets: <type 'classobj'>
# if m is classobj, how can i check a variable is class object?

我的问题是:我如何检查一个变量是一个类对象?

一个简单的解决方案:

if str(type(m)) == "<type 'classobj'>":
    # do something

但我认为至少有一种经典的方法可以检查这一点。

4

5 回答 5

39

使用检查

import inspect
print inspect.isclass(obj)
于 2013-04-05T19:07:15.030 回答
21

在 2.x 中,类对象可以是 a type(new-style classes)或 a classobj(classic classes)。type类型是内置的,但类型classobj不是。那么,你如何得到它?这就是types模块的用途。

isinstance(MyClass, (types.TypeType, types.ClassType))

在 3.x 中,您无需担心经典类,因此:

isinstance(MyClass, type)

即使你想直接比较类型,你也不应该通过它们来比较任何对象str。比较:

>>> class MyClassicClass:
...     pass
>>> str(type(MyClassicClass)) == "<type 'classobj'>"
True
>>> str("<type 'classobj'>") == "<type 'classobj'>"
True

您几乎总是可以直接比较对象:

>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False

(在极少数情况下,由于某种原因您确实需要比较字符串表示形式,您需要的是repr,而不是str。)

于 2013-04-05T19:00:07.827 回答
8

新样式类(如您的示例中显式派生object,或在 Python 3 中隐式派生)不是 type classobj。只有旧式类是classobjs。因此,对于您编写的示例类,您可以简单地检查是否MyClass是 的实例type,因为所有新样式类都是:

isinstance(MyClass, type)

因为所有新式类都派生自object你也可以这样做:

issubclass(MyClass, object)

我建议不要:

type(MyClass) == type

如果类的类型不是type,而是元类,这将失败。当然,尽管可能会有用例。

如果你真的需要看看你是否有一个老式的类,你可以导入types模块并使用types.ClassType,或者只是声明一个老式的类,看看你正在测试的类是否属于同一类型:

class OldStyleClass:
   pass
OldStyleClass = type(OldStyleClass)

isinstance(MyClass, OldStyleClass)
于 2013-04-05T19:06:06.047 回答
3

这是你要找的吗?

>>> class A(object):
...    pass
>>> isinstance(A, type)
True

>>> isinstance("asd", type)
False

但仅适用于从对象继承的类。

于 2013-04-05T18:58:40.597 回答
0

有时下一个正在工作(如果您想确定如何打印对象):

def is_class(o):
    return hasattr(o, '__dict__')
于 2016-02-19T17:39:13.690 回答