如何检查变量是否为类对象

时间:2013-04-05 18:55:35

标签: python class python-2.7

假设一个简单的类:

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

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

5 个答案:

答案 0 :(得分:26)

使用inspect

import inspect
print inspect.isclass(obj)

答案 1 :(得分:16)

在2.x中,类对象可以是type(新式类)或classobj(经典类)。 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。)

答案 2 :(得分:3)

这是你要找的吗?

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

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

但仅适用于从object继承的类。

答案 3 :(得分:3)

新样式类(在您的示例中显式地从object派生,或在Python 3中隐式派生)不是classobj类型。只有旧式的课程是classobj。因此,对于您编写的示例类,您只需检查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)

答案 4 :(得分:-1)

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

def is_class(o):
    return hasattr(o, '__dict__')