lch
发布于 2026-05-11 / 0 阅读
0

全网最适合入门的面向对象编程教程:33 Python的内置数据类型-对象Object和类型Type的关系


摘要:

对象是某个类型的实例,是内存中的实体,有类型和属性;在Python中,类型本身也是对象,所有的类型(类)都是type类型的实例。

文档和代码获取:

本文档主要介绍如何使用 Python 进行 面向对象编程 ,需要读者对 Python 语法和 单片机 开发具有基本了解。相比其他讲解 Python 面向对象编程的博客或书籍而言,本文档更加详细、侧重于嵌入式 上位机 应用,以上位机和 下位机 的常见 串口 数据收发、数据处理、动态图绘制等为应用实例,同时使用 Sourcetrail代码软件对代码进行可视化阅读便于读者理解。

正文

object和type是 CPython 解释器内建对象,它们的地位非常特殊,是Python 语言的顶层元素:

  • object是所有其他对象的基类, object自身没有基类,它的 数据类型 被定义为type。

  • type 继承 了object,所有类型对象都是它的实例,包括它自身。 判断一个对象是否为类型对象,就看它是否是type的实例。

现在回到开篇的问题,isinstance()内置方法本质是在判断对象的数据类型,它会向基类回溯,直至回溯到object,在CPython中最终调用如下函数:

static inttype_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b){ do { if (a == b) return 1; a = a->tp_base; } while (a != NULL);  return (b == &PyBaseObject_Type);} print(isinstance(object, type)) # 1print(isinstance(type, object)) # 2print(isinstance(type, type)) # 3print(isinstance(object, object))# 4 print(object.__class__) # print(type.__class__) # 

我们可以看看在源码中,type类和object类分别是什么:

  • type类实际上是:

#define PyVarObject_HEAD_INIT(type, size) 1, type, size, PyTypeObject PyType_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "type", /* tp_name */ sizeof(PyHeapTypeObject), /* tp_basicsize */ sizeof(PyMemberDef), /* tp_itemsize */ 0, /* tp_base */ ...}
  • object类实际上是:

PyTypeObject PyBaseObject_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "object", /* tp_name */ sizeof(PyObject), /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_base */ ...}

这两个结构中的第一行:

PyVarObject_HEAD_INIT(&PyType_Type, 0)

它表示这个类结构的对象类型,object和type在CPython中分别对应PyTypeObject(对 PyObject 的封装)类型的PyBaseObject_Type和PyType_Type变量,其中用于表示类型的成员ob_type是一个指针,均指向PyType_Type。所以object和type对象类型均为type。(object类将类型(即谁实例化了这个类)设置成了type类,type类将类型设置成了自己)

然后在type类的初始化过程中,执行了如下代码:

type->tp_base = &PyBaseObject_Type;

转换成python为:

type.__base__ = (object,) 

表示将object类指定为type类的父类。