Python中type类和object类哪个先出现?原理解析
关于
type和object的循环依赖问题解答 你观察到的两个现象完全正确,这并不是逻辑悖论,本质是Python类型系统根对象的引导初始化(bootstrap)机制跳开了常规类的创建规则,不存在谁“先按普通流程创建谁”的先后顺序。
常规类的创建规则
我们平时在Python代码里定义类时,默认遵循两个固定规则:
- 定义类前,它要继承的所有基类必须已经完成初始化
- 类本身是由它的元类(默认是
type)实例化生成的,所以元类也必须在类定义前就可用
如果所有类都严格走这个流程,确实会出现你说的循环矛盾,但type和object是整个Python类型系统的两个根节点,根本不走常规创建流程,是解释器启动阶段在C层面硬编码构造出来的。
底层初始化的实际流程
解释器启动时两个对象的构造是分阶段完成的,不存在严格的谁先创建完成的顺序:
- 首先给
type分配C层面的结构体内存,填充最核心的类型元数据字段,此时的type是个半成品,没有设置基类,也没有对外暴露为可用状态 - 接着给
object分配C层面的结构体内存,同样填充核心基础字段,此时object也是半成品,没有绑定元类,也没有挂载内置方法 - 两个半成品的内存都就位后,直接通过C层面的指针操作补全关联关系:
- 把
type的基类指针指向object,对应Python层看到的type.__bases__ == (object,) - 把
object的类指针指向type,对应Python层看到的object.__class__ is type - 顺便把
type自己的类指针也指向自身,对应type.__class__ is type——毕竟作为元类的根,它自己的实例化也不需要别的元类参与
- 把
- 最后给两个对象补全所有内置方法、属性标记,把它们设置为完全可用的状态,之后所有内置类、用户自定义类的创建,才开始遵循前面说的常规类规则。
说白了,“创建类需要先有基类和元类”的规则,本身就是这两个根对象初始化完成后才生效的上层规则,根本约束不到解释器启动阶段搭基础的引导过程,就像你不能用“砌墙必须站在脚手架上”的要求,去质疑脚手架是直接固定在地面上、没搭在墙上一样。
你可以在Python交互环境自行验证这几个特殊的关联关系:
>>> object.__class__ <class 'type'> >>> type.__bases__ (<class 'object'>,) >>> type.__class__ <class 'type'>
内容的提问来源于stack exchange,提问作者smwikipedia
相关产品推荐
相关产品推荐

