我正在更低层次上编写一个小框架,用于在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)。你能帮我解决一下这个问题吗?
答案 0 :(得分:11)
inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或获取显示详细回溯所需的所有信息。
例如,如果对象是类,则inspect.isclass()
函数返回true:
>>> import inspect
>>> inspect.isclass(inspect)
False
>>> inspect.isclass(inspect.ArgInfo)
True
>>>
答案 1 :(得分:4)
使用isinstance
和type
,types.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'>