Python源码学习之PyObject和PyTypeObject

2014-11-24 10:27:05 · 作者: · 浏览: 0

Python C api中的绝大多数函数其参数和返回值中包含 PyObject*。这指针类型指向一个可以表示任何Python对象的不透明的数据结构。所有的Python对象在多数情况下以相同的方式对待。


所有的Python对象(甚至是Python的整数)都包含一个类型和引用计数。一个对象的类型决定了其是一个整数、列表、用户自定义函数还是其他。


引用计数对Python非常重要,引用计数必须显式地操作(通过Py_INCREF()、 Py_DECREF()等)。


本文:


Include/object.h 提供了比较详细的注释。


Python2.7



Python3.2



PyObject 是有两个成员的结构体,引用计数、对象类型:


其类型分别为 Py_ssize_t 和 struct _typeobject


Py_ssize_t 是一个所占字节数与 size_t 相同的有符号的整数类型(C99中没有定义ssize_t这种类型,某些编译器比如gcc扩展有该类型)。关于该类型的一个介绍见PEP 353


源码位于:Include/pyport.h



其中,Py_intptr_t 是可以存放指针的整数类型(C99中定义有 intptr_t),在不支持intptr_t的环境下,它是int、long或long long的别名。


可变大小的容器对象


与PyObject相比,它多了一个成员:


其中:ob_size 是元素的数目,而不是所需的字节的数目。


Python2.7


Python3.2


3个宏用来获取这3个成员的值


每一个PyObject第二个成员是都是一个类型对象(PyTypeObject)。PyTypeObject本身是也一个PyVarObject


额,这个东西太复杂了,一堆堆的函数指针,看不懂。


创建与析构?


C API函数和这些函数指针的对应关系(调用关系):