官术网_书友最值得收藏!

0.3.3 對(duì)象機(jī)制的基石——PyObject

Python的對(duì)象機(jī)制是基于PyObject拓展開來的。在實(shí)際發(fā)布的Python中,PyObject的定義非常簡單。相關(guān)源碼(Include/object.h)如下:


// Include/object.h
#define _PyObject_HEAD_EXTRA            \
    struct _object *_ob_next;           \
    struct _object *_ob_prev;

typedef struct _object {
    _PyObject_HEAD_EXTRA            // 雙向鏈表 垃圾回收 需要用到
    Py_ssize_t ob_refcnt;           // 引用計(jì)數(shù)
    struct _typeobject *ob_type;    // 指向類型對(duì)象的指針,決定了對(duì)象的類型
} PyObject;

在PyObject的定義中,變量ob_refcnt與Python的內(nèi)存管理機(jī)制有關(guān),它實(shí)現(xiàn)了基于引用計(jì)數(shù)的垃圾收集機(jī)制。對(duì)于某一個(gè)對(duì)象A,當(dāng)有一個(gè)新的PyObject*引用該對(duì)象時(shí),A的引用計(jì)數(shù)增加1;當(dāng)有一個(gè)PyObject*被刪除時(shí),A的引用計(jì)數(shù)則減少1。當(dāng)A的引用計(jì)數(shù)減少到0時(shí),就可以從堆上刪除A,以釋放出內(nèi)存供別的對(duì)象使用。

在ob_refcnt之外,我們可以看到ob_type是一個(gè)指向_typeobject結(jié)構(gòu)體的指針,這個(gè)結(jié)構(gòu)體是一個(gè)什么對(duì)象呢?實(shí)際上,這個(gè)結(jié)構(gòu)體對(duì)應(yīng)著Python內(nèi)部的一種特殊對(duì)象,即用來指定一個(gè)對(duì)象類型的類型對(duì)象。這個(gè)類型對(duì)象將在后面章節(jié)詳細(xì)分析??梢钥吹?,在Python中,對(duì)象機(jī)制的核心其實(shí)非常簡單,一個(gè)是引用計(jì)數(shù),一個(gè)是類型信息。

PyObject中定義了每一個(gè)Python對(duì)象都必須有的內(nèi)容,這些內(nèi)容將出現(xiàn)在每一個(gè)Python對(duì)象所占用內(nèi)存的最開始的字節(jié)中。

主站蜘蛛池模板: 昌吉市| 区。| 肥东县| 沁阳市| 淮北市| 南昌市| 抚松县| 连平县| 翼城县| 瓮安县| 天峨县| 南雄市| 舒兰市| 碌曲县| 宁都县| 镇康县| 长治市| 宽城| 饶平县| 南漳县| 新乡县| 苍南县| 车致| 江门市| 江口县| 绥棱县| 镇雄县| 沛县| 宜昌市| 大渡口区| 江孜县| 泌阳县| 玉田县| 新乡市| 清丰县| 清涧县| 抚顺县| 南木林县| 东乌珠穆沁旗| 秦皇岛市| 惠安县|