1 Python3原始碼 內建物件

2021-09-13 17:02:32 字數 2270 閱讀 6626

python中的類和例項都是通過python內的物件來實現的。python中已經預先定義了一些型別物件。這些內建型別物件通過例項化,可以建立內建型別物件的例項物件。

在python中,物件就是為c中的結構體在堆上申請的一塊記憶體,一般來說,物件是不能被靜態初始化的,並且也不能在棧空間上生存。唯一的例外就是型別物件,python中所有的內建的型別物件都是被靜態初始化的。

在python中,乙個物件一旦被建立,它在記憶體中的大小就是不變的了。這就意味著那些需要容納可變長度資料的物件只能在物件內維護乙個指向一塊可變大小的記憶體區域的指標。

pyobject是整個python物件機制的核心,定義如下:

// object.h

typedef struct _object pyobject;

其中_pyobject_head_extra定義如下:

// object.h

#ifdef py_trace_refs

/* define pointers to support a doubly-linked list of all live heap objects. */

#define _pyobject_head_extra \

struct _object *_ob_next; \

struct _object *_ob_prev;

#define _pyobject_extra_init 0, 0,

#else

#define _pyobject_head_extra

#define _pyobject_extra_init

#endif

可以看到release編譯時不會定義py_trace_refs。

pyobject類中ob_refcnt與記憶體引用計數相關,ob_type用來指定乙個物件型別的型別物件。在python中,物件機制的核心乙個是引用計數,乙個就是型別資訊。

每乙個python物件除了必須有這個pyobject內容外,還應該占有一些額外的記憶體,放置些其他的東西。比如float物件除了pyobject,還有乙個額外的double變數,如下定義:

// object.h

/* pyobject_head defines the initial segment of every pyobject. */

#define pyobject_head pyobject ob_base;

把浮點物件這樣不包含可變長度資料的物件稱為「定長物件」,而字串物件這樣包含可變長度資料的物件稱為「變長物件」,它們的區別在於定長物件的不同物件占用的記憶體大小是一樣的,而變長物件的不同物件占用的記憶體可能是不一樣的。

表示變長物件的結構體pyvarobject定義如下:

// object.h

typedef struct pyvarobject;

每乙個可變python物件除了有pyvarobject內容外,還占有一些額外的記憶體,放置些其他的東西。比如list物件為變長物件,它的結構體如下:

// listobject.h

typedef struct pylistobject;

其中pyobject_var_head定義了pyvarobject型別物件,如下:

// object.h

/* pyobject_var_head defines the initial segment of all variable-size container objects. */

#define pyobject_var_head pyvarobject ob_base;

物件對應的型別物件定義如下:

// object.h

typedef struct _typeobject pytypeobject;

定義中包含了許多資訊,主要分為4類:

型別物件的型別是pytype_type:

pytypeobject pytype_type = ;
python的c api分為兩類,一類稱為範性的api(aol,abstract object layer),這類api都具有諸如pyobject_*的形式,可以應用在任何python物件上;另一類是與型別相關的api(col,concrete object layer),這類api通常只能作用在某一種型別的物件上,對於每一種內建物件,python都提供了這樣的一組api。

pyspider環境部署1 python3安裝

環境準備 centos7 centos系統會自帶python2,我們最好不理它,使用python3執行python指令碼,因為有些程式會依賴python2環境,比如yum。1.安裝依賴環境 3.安裝python3 我個人習慣安裝在 usr local python3 建立目錄 mkdir p usr...

Python3檔案操作1 Python3

文字檔案 由單一特定的編碼字元組成 如 txt檔案 python對文字檔案和二進位制檔案都有統一的操作步驟,開啟 操作 關閉 操作主要包括 讀取檔案內容 寫入檔案內容 刪除檔案內容 修改檔案內容 注意 開啟檔案後,會將檔案放在記憶體中,操作完成後需要關閉檔案 內建函式open 制定模式貸款誒檔案並建...

Python 內建的object物件 1

新式類都有乙個 new 的靜態方法,它的原型是object.new cls cls是乙個類物件,當呼叫c args,kargs 來建立乙個類c的例項時,python的內部呼叫是 c.new c,args,kargs 然後返回值是類c的例項c 確認c是c的例項後 python再呼叫c.init c,a...