Python原始碼閱讀 type

2021-08-28 12:56:55 字數 4050 閱讀 8947

首先看乙個例子:

1 >>> a = 1

2 >>>a

3 14 >>>type(a)5'

int'>

6 >>>type(type(a))7'

type

'>

8 >>>type(int)9'

type

'>

10 >>>type(type(type(a)))11'

type

'>

12 >>>type(type(int))13'

type

'>

我們反向推導乙個int物件是怎麼生成的。

**位置 include/object.h

1 typedef struct

_typeobject pytypeobject;

說明:

1

1. tp_name

2 型別名, 這裡是"

type"3

42. pyvarobject_head_init(&pytype_type, 0

)5 pyvarobject_head_init, 這個方法在 include/object

.h中,

6等價於

7 ob_refcnt = 1

8 *ob_type = &pytype_type

9 ob_size = 0

1011 即, pytype_type的型別是其本身!1

. tp_name

12 型別名, 這裡是"

type"13

142. pyvarobject_head_init(&pytype_type, 0

)15 pyvarobject_head_init, 這個方法在 include/object

.h中,

16等價於

17 ob_refcnt = 1

18 *ob_type = &pytype_type

19 ob_size = 0

2021 即, pytype_type的型別是其本身!

所有type都是pytypeobject的」例項」: pytype_type/pyint_type。

**位置 objects/typeobject.c

1 pytypeobject pytype_type =;
說明:

1

1. tp_name

2 型別名, 這裡是"

type"3

42. pyvarobject_head_init(&pytype_type, 0

)5 pyvarobject_head_init, 這個方法在 include/object

.h中,

6等價於

7 ob_refcnt = 1

8 *ob_type = &pytype_type

9 ob_size = 0

1011 即, pytype_type的型別是其本身!1

. tp_name

12 型別名, 這裡是"

type"13

142. pyvarobject_head_init(&pytype_type, 0

)15 pyvarobject_head_init, 這個方法在 include/object

.h中,

16等價於

17 ob_refcnt = 1

18 *ob_type = &pytype_type

19 ob_size = 0

2021 即, pytype_type的型別是其本身!1

. tp_name

22 型別名, 這裡是"

type"23

242. pyvarobject_head_init(&pytype_type, 0

)25 pyvarobject_head_init, 這個方法在 include/object

.h中,

26等價於

27 ob_refcnt = 1

28 *ob_type = &pytype_type

29 ob_size = 0

3031 即, pytype_type的型別是其本身!

結構

第一張圖, 箭頭表示例項化(google doc用不是很熟找不到對應型別的箭頭)

第二張圖, 箭表示指向

#1. int 的 型別 是`type`

2 >>>type(int)34

#2. type 的型別 還是`type`, 對應上面說明第二點

5 >>> type(type(int))

注意: 無論任何時候, ob_type指向的是 pytypeobject的例項: pytype_type/pyint_type…

**位置 objects/intobject.c

pytypeobject pyint_type =;

說明:1. "

int"

pyint_type的型別名是int

2.pyvarobject_head_init(&pytype_type, 0

)pyint_type的*ob_type = &pytype_type

其結構圖為:

即就是python的如下**:

1 >>> type(1)2'

int'>

34 >>> type(type(1))5'

type

'>

**位置 include/intobject.h

1 typedef struct

pyintobject;

5說明:

61. pyintobject為整數型別,宣告乙個整數後得到整數物件, 物件ob_type指向pyint_type物件

1.一切都是物件

2.pytype_type/pyint_type/pystring_type....等,

這些是`型別物件`,可以認為是同級,都是pytypeobject這種`型別`的例項!

3.雖然是同級,

但是其他py***_type,其型別指向pytype_type,

pytype_type的型別指向自己,它是所有型別的`型別`

4.pytypeobject是乙個變長物件

5.每個object,例如pyintobject都屬於一種`型別`,

object初始化時進行關聯。

物件的多型, 例如hash:

1 >>> hash(1)

2 13 >>> hash("

abc"

)4 1453079729188098211

從上面資料結構可以看到, 方法及屬性, 在不同type例項化時就確定了:

1 pytypeobject pyint_type =

67 pytypeobject pystring_type =

python內部傳遞的是泛型指標pyobject *, 函式呼叫時, 找到其型別* ob_type, 然後呼叫,即:

object -> ob_type -> tp_hash

type原始碼分析

var class2type var tostring class2type.tostring 儲存tostring,呼叫 tostring.call obj 或者object.prototype.tostring.call obj 獲取內建型別 var hasown class2type.haso...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...