Python原始碼學習 內建型別簡析並簡析int物件

2021-08-17 13:47:07 字數 1792 閱讀 8590

本文環境python2.5系列

參考書籍位於include/object.h中

typedef

struct _object pyobject;

typedef

struct pyvarobject;

#define pyobject_head           \

_pyobject_head_extra \

py_ssize_t ob_refcnt; \ //引用計數

struct _typeobject *ob_type; // 物件型別

#define pyobject_var_head \

pyobject_head \

py_ssize_t ob_size; /* number of items in variable part */

typedef struct _typeobject  pytypeobject;
通過以上分析後,我們簡析一下int型別的建立過程;

pyintobject的定義如下

typedef

struct pyintobject;

其中生成的型別為

pytypeobject pyint_type = ;
包括雜湊函式,整數比較,整數顯示等方法。

其中定義的整型物件的方法如下:

static pynumbermethods int_as_number = ;
有相加,相減,相除等python支援的整型操作方法,由此看見當生成乙個pyintobject時,其中的ob_type為pyint_type,並且pyint_type的型別為pytype_type,該為所有型別的型別。

當需要建立乙個int物件時,呼叫pyint_fromlong(long);

pyobject *

pyint_fromlong(long ival)

#endif

if (free_list == null)

/* inline pyobject_new */

v = free_list;

free_list = (pyintobject *)v->ob_type;

pyobject_init(v, &pyint_type);

v->ob_ival = ival;

return (pyobject *) v;

}

#define pyobject_init(op, typeobj) \

( (op)->ob_type = (typeobj), _py_newreference((pyobject *)(op)), (op) )

將ob_type的域的值設定成pyint_type,至此乙個整型物件就生成了。

當兩個整型物件相加時,

static pyobject *

int_add(pyintobject *v, pyintobject *w)

先將整型數字轉換成long型別,然後相加,如果相加之後的結果沒有溢位則,呼叫nb_add方法相加兩個值,並將結果生成乙個長整型物件返回。

至此,大致分析了一下python中的基礎型別的構成,並簡析了下python中的整型物件的型別與新建,如需要詳細內容可檢視原始碼。

Go原始碼剖析 內建型別

go內建型別定義在 goroot src builtin builtin.go中,分為內建函式和內建資料型別內建資料型別 內建函式 copy 定義 func copy dst,src type int 作用 把源切片拷貝到目標變數,返回拷貝的元素數量 copy 定義 func copy dst,sr...

Go原始碼剖析 內建型別

go內建型別定義在 goroot src builtin builtin.go中,分為內建函式和內建資料型別內建資料型別 內建函式 copy 定義 func copy dst,src type int 作用 把源切片拷貝到目標變數,返回拷貝的元素數量 copy 定義 func copy dst,sr...

Python原始碼學習 之資料型別

根據manual中the standard type hierarchy一節的型別資訊,我們首先嘗試列出乙個表 型別 物件類 pynone type pyobject none pybool type pylongobject notimplemented pyellipsis type pyobj...