如何判断一个变量是类还是对象

3 投票
4 回答
1295 浏览
提问于 2025-04-15 16:24

我正在做一个小项目,想要写一个框架来创建测试用例,使用的是Python。在这个过程中,我想知道一个特定的变量是不是某个类的实例,或者它本身是不是一个类。如果它是一个类,我还想确认它是否是我框架中定义的某个类的子类。我该怎么做呢?

class MyBase(object):
    pass

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

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

我想知道属性a1和a2是否是某个类或类型的实例(比如a1在B中是字符串类型),或者a2本身是否是类对象(也就是说a2是B中的A)。你能帮我看看我该怎么判断吗?

4 个回答

3

使用 type() 这个函数。它会告诉你一个对象的类型。你可以从 types 库中找到一些常见的类型来对照。老式类(那些没有继承任何东西的类)属于 types.ClassType 类型。而像你例子中的新式类则属于 types.TypeType 类型。这个模块里还有很多其他有用的类型,比如字符串等。

如果你在一个老式类的实例上调用 type(),它会返回 types.InstanceType。而在一个新式类的实例上调用它,则会返回这个类本身。

4

使用 isinstancetype,还有 types.ClassType(后者是用于旧式类的):

>>> isinstance(int, type)
True

>>> isinstance(1, type)
False
11

可以使用 inspect 模块

inspect 模块提供了几个很有用的功能,可以帮助你获取关于活跃对象的信息,比如模块、类、方法、函数、错误追踪、帧对象和代码对象等。例如,它可以帮助你查看一个类的内容,获取一个方法的源代码,提取并格式化一个函数的参数列表,或者获取你需要的所有信息来显示详细的错误追踪。

举个例子,inspect.isclass() 这个函数如果对象是一个类,就会返回真:

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

撰写回答