之前的
PyObject
中我们看到了ob_type
,而上一篇文章中举过了PyBaseObject_Type
的例子,这一次,要介绍一下PyTypeObject
以及PyType_Type
每一个PyTypeObject
中都储存了PyObject
中所需要的各种各样的信息,主要分为四类(借用一下《Python源码分析》中的话):
- 类型名:
tp_name
- 创建该类型对象时分配内存空间大小的信息
- 与该类型对象相关的操作信息
PyType_Type
每一个对象都会有它对应的类型对象的指针,比如一个PyLongObject
它指向的类型对象是PyLong_Type
,一个PyDictObject
指向的类型对象是PyDict_Type
但是这是我们就会有疑问,类型对象也是对象,按照之前所说,对象最基本的模板就是PyObject
,所以PyLong_Type
和PyDict_Type
这些类型对象也应该有对应的类型对象,它们的类型对象是谁呢?
其实就是之前所说的PyType_Type
,当然,这个东西没有特别神奇,和PyBaseObject_Type
它们其实都是一个具体的PyTypeObject,只是描述的东西有所不同
它们内部很多内容都是要和其它东西扯上关系的,强行看只会让自己很痛苦,现在重点是对它们有所理解
下面是我的理解,仅作参考,如果,大家对此有什么理解,也可以在下面说出来大家一起看
我的理解
最开始介绍的是PyObject
,它是一个结构体,它就像int、long这样的类型或者我们常说的面向对象中的类一样,我最初的理解就是把它看作一个类,一个对象的模板,一个对象的类型,就如同我们常说123是整型一样
但是突然出现一个PyLong_Type
这样的东西,它是PyLongObject
的类型对象,突然让我混乱了起来
查看PyLong_Type
的内容的时候看到很多函数指针,这时候我突然就想结构体里面只要有数据以及函数指针,那不就是一个类了吗,然后就它的结构体变量就是我们的对象了,那么出现PyLong_Type
到底有何用?
然而,到了看Python源码的时候,我却像是忘了这个东西,其实,PyLong_Type
不就是我所谓的那个类吗,它有着各种各样的函数指针,不就是这个类的方法么,PyObject
不就是我所谓的真正的对象的模板吗,它有的仅仅应该是属于自己的数据(那个引用数据),当然还得有它对应的那个‘类’的指针,只有PyObject
和PyLong_Type
放在一块,才是我们写在代码中的那个类
所以我们新建对象的时候,在C的层面,其实是根据PyObject
这个数据部分的模板建,然后给他一个类型对象,这个对象有着各种各种函数的指针,所以它其实应该是一个结构体变量,而它对应的结构体PyTypeObject
(它也是PyObject
扩展而来),
PyTypeObject
的各种变量就是我们的类型对象,它们对应的类型对是PyType_Type
(类型的类型),PyType_Type
也是类型对象,它对应的类型对象就是它自己,所以这个体系就彻底建立完毕了
欢迎在下方谈自己的理解