- Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 429字
- 2021-04-30 12:39:31
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é)中。
- Node.js+Webpack開發(fā)實(shí)戰(zhàn)
- Visual FoxPro程序設(shè)計(jì)教程
- 實(shí)戰(zhàn)Java程序設(shè)計(jì)
- 從學(xué)徒到高手:汽車電路識(shí)圖、故障檢測與維修技能全圖解
- Amazon S3 Cookbook
- Easy Web Development with WaveMaker
- C語言程序設(shè)計(jì)
- Building Serverless Architectures
- Machine Learning With Go
- Building Apple Watch Projects
- Web開發(fā)新體驗(yàn)
- Spring Boot 3:入門與應(yīng)用實(shí)戰(zhàn)
- Python機(jī)器學(xué)習(xí)
- C#程序設(shè)計(jì)基礎(chǔ)與實(shí)踐
- 你也能看得懂的Python算法書