PyTypeObject对象
不知道你还否还记得在我的上一篇文章中关于PyObject
中的ob_type
成员,在上篇文章中我没有对它进行展开,只是告诉读者这是用来指明当前对象是何种类型以及一些类型相关的信息.那么本篇博文则是单独把ob_type
拿出来分析,通过查看PyObject
对象,你可以发现ob_type
成员是一个struct _typeobject
而这个数据结构在Python内部有另外一个typedef的别名,那就是PyTypeObject
这也是本文需要分析的一个内部对象.因为这个数据结构很长,有很多的数据成员,为了让代码更易读,我不会全部列出所有的成员,而是一点点揭开面纱.
PyTypeObject的用途?
Python官方文档上说PyTypeObject
或许是Python对象机制中最为重要的一个结构体,因为这个结构体可以用来定义新的类型,这个结构体控制了对象的行为.此外这个结构体的相比于Python内部的其它对象而言也是相当的大,这是因为这个结构体需要存储大量的数据成员和大量的C函数指针, 这其中包含了了一部分与类型相关的函指针.总的来说PyTypeObject
就是用来描述一种类型对象的行为的结构体,比如对于一个int类型的对象和string类型的对象,两者的初始化肯定不一样,两者的打印输出方式,两者的比较运算方式肯定都不一样等等,因此对于每一种类型对象来说都要有一个PyTypeObject
对象保存与这个类型相关的一些数据成员和函数指针.并且每个类型对象在初始的时候都会初始化PyTypeObject
对象,类型信息就固定下来了.具体细节可以参考附录中关于如何自定义新的类型对象.不知道上面说了这么一大通的理论大家是否理解了PyTypeObject
的用途? 下面从Python层面我们来看看PyTypeObject
的用途.
>>> a = 1
>>> print a
>>> sa = "zhang"
>>> print sa
上面简单的初始化了一个int对象和一个string对象,那么在初始化的时候malloc应该分配多大的空间呢?,这个信息其实存放在PyTypeObject
中,print打印这两个对象的是如何知道怎么打印的呢?因为在C语言层面打印一个字符串和打印一个整数是不一样的,那么对于每种类型该如何打印输出也是存放在PyTypeObject
中的.就拿int类型的对象来说它的大小放在PyTypeObject
对象的tp_basicsize
数据成员中,可以通过int对PyTypeObject
初始化的代码中看到.
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
...... //此处省略N多成员
printfunc tp_print; //用于输出类型对象的值
......
}PyTypeObject;
./Include/object.h
int对象的PyTypeObject初始化
PyTypeObject PyInt_Type =