1.python中所有对象机制的基石是Pyobject,它的定义如下
typedef struct _object{
Pyobject_HEAD
}PyObject
#define PyObject_HEAD \
int ob_refcnt;
struct _typeobject *ob_type;
typedef struct_object{
int ob_refcnt
strucu _typeobject *ob_type
}PyObject
实际中,python定义的PyObjec类似于上图。整形变量ob_refcnt与Python内存管理机制有关,体现了基于引用计数的垃圾收集机制。而ob_type是python的一种特殊对象,是用来指定一个对象类型的类型对象。Python中,对象机制的核心其实非常简单,一个是引用计数,一个是类型信息。
PyObject除了上述的信息之外,整型对象,字符串对象,list对象等都额外保存了属于自己的信息。
2.定长和变长对象
上述的Pyobject是定长对象的定于,而不定长对象的定义如下
#define PyObject_VAR_HEAD \
PyObject_HEAD \
int ob_size; /* 指明对象容纳了多少元素 */
typedef struct{
PyObject_VAR_HEAD
}PyVarObject
3.类型对象 _typeobject
typedef struct _typeobject{
PyObject_VAR_HEAD
char *tp_name;
int tp_basicsize,tp_itemsize;
destructor tp_print;
printfunc tp_print;
hashfunc tphash;
ternaryfunc tp_call;
}PyObject
4.创建整数对象的流程
首先 PyInt_Type中的 tp_new会被调用,如果这个tp_new为NULL(假设,一般不会为NULL),那么会到tp_base的基类去寻找tp_new操作。在object_new中 会访问tp_basicsize,完成申请内存。一般为sizeof(PyIntObject)。调用完tp_new之后,会继续调用PyInt_Object的tp_init。
5.对象的行为
在PyTypeObject中定义了大量的函数指针,指向某个函数。tp_hash是一个hashfunc类型的变量,hashfunc实际上是一个函数指针。这些函数指针可以视为类型对象中所定义的操作。在这些操作信息中,有三组非常重要的操作族,在PyTypeObject中,它们是tp_as_number,tp_as_sequence,tp_as_mapping。他们分别指向PyNumberMethods, PySequenceMethods,PyMappingMethons函数族。
PyNumberMethods 这个函数族如下:
typedef PyObject * (*binaryfunc) (PyObject *, PyObject *);
typedef struct {
binaryfunc nb_add;
binaryfunc nb_subtract;
....
}PyNumberMethods
PySequenceMethods,PyMappingMethons分别定义了一个序列对象和关联对象,例如list和dict。
6.类型的类型
抽象的类型如下:
PyTypeObject PyType_Type = (
PyTypeObject _HEAD_INIT(&PyType_Type)
0, /* ob_size */
"type" /* tp_name */
sizeof(PyHeapTypeObject), /* tp_basicsize */
sizeof(PyMemberDef), /* tp_itemsize */
);
以PyInt_Type为例
PyTypeObject PyInt_Type = (
PyObject_HEAD_INIT(&PyType_Type)
0,
"int",
sizeof(PyIntObject),
.....
);
最终一个int类型被创建的完整流程图如下: