python源码分析笔记(1)

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类型被创建的完整流程图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值