首先看乙個例子:
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所有type都是pytypeobject的」例項」: pytype_type/pyint_type。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的型別是其本身!
**位置 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'**位置 include/intobject.hint'>
34 >>> type(type(1))5'
type
'>
1 typedef structpyintobject;
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)從上面資料結構可以看到, 方法及屬性, 在不同type例項化時就確定了:2 13 >>> hash("
abc"
)4 1453079729188098211
1 pytypeobject pyint_type =python內部傳遞的是泛型指標67 pytypeobject pystring_type =
pyobject *
, 函式呼叫時, 找到其型別* ob_type
, 然後呼叫,即:object -> ob_type -> tp_hashtype原始碼分析
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...