如何识别变量是类还是对象

时间:2009-11-26 09:11:15

标签: python

我正在更低层次上编写一个小框架,用于在Python中为我的项目创建测试夹具。在这里我想知道一个特定的变量是某个类的实例还是一个类本身,如果它是一个类,我想知道它是否是我的框架定义的某个类的子类。我该怎么做?

class MyBase(object):
    pass

class A(MyBase):
    a1 = 'Val1'
    a2 = 'Val2'

class B(MyBase):
    a1 = 'Val3'
    a2 = A

我想知道属性a1和a2是类/类型的实例(a1是B中的字符串类型)还是类对象本身(即a2是B中的A)。你能帮我解决一下这个问题吗?

4 个答案:

答案 0 :(得分:11)

使用inspect module

  

inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或获取显示详细回溯所需的所有信息。

例如,如果对象是类,则inspect.isclass()函数返回true:

>>> import inspect
>>> inspect.isclass(inspect)
False
>>> inspect.isclass(inspect.ArgInfo)
True
>>> 

答案 1 :(得分:4)

使用isinstancetypetypes.ClassType(后者适用于旧式课程):

>>> isinstance(int, type)
True

>>> isinstance(1, type)
False

答案 2 :(得分:3)

使用type()功能。它将返回对象的类型。您可以从types库中获取“库存”类型以匹配。旧式类(不从任何东西继承)具有类型types.ClassType。像您的示例中的新式类具有类型types.TypeType。此模块中还有许多其他有用的类型用于字符串等。

在旧式类的实例上调用type()会返回types.InstanceType。在一个新式类的实例上调用它会返回该类本身。

答案 3 :(得分:1)

使用type()

>>> class A: pass
>>> print type(A)
<type 'classobj'>
>>> A = "abc"
>>> print type(A)
<type 'str'>