Python 源碼閱讀:對象
(點擊
上方藍字
,快速關注我們)
來源:伯樂在線 - wklken
如有好文章投稿,請點擊 → 這裡了解詳情
參考內容: Python源碼 + >
用源代碼+說明+圖解的方式, 盡量說明白吧, 有一份注釋在github上
內容:
->
對象/
類型->
各種內建類型對象及機制->
虛擬機相關
(
編譯及執行)
->
內存管理/
動態載入/
多線程等PS: 畫圖的話google doc很好用
好的, 第一篇開始
一切皆為對象
對象, 在C語言是如何實現的?
Python中對象分為兩類: 定長(int等), 非定長(list/dict等)
所有對象都有一些相同的東西, 源碼中定義為PyObject和PyVarObject, 兩個定義都有一個共同的頭部定義PyObject_HEAD(其實PyVarObject有自己的頭部定義PyObject_VAR_HEAD, 但其實際上用的也是PyObject_HEAD).
源碼位置: Include/object.h (https://github.com/wklken/Python-2.7.8/blob/master/Include/object.h)
PyObject_HEAD
Python 內部, 每個對象擁有相同的頭部.
定義
/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD
_PyObject_HEAD_EXTRA
Py_ssize_t
ob_refcnt
;
struct
_typeobject *
ob_type
;
說明
1.
_PyObject_HEAD
_
EXTRA先忽略
,
雙向鏈表結構
,
後面垃圾回收再說
2.
Py_ssize_t ob_refcnt
Py_ssize
_
t在編譯時確定,
整型
ob_refcnt
,
引用計數
,
跟
Python
的內存管理機制相關(
基於引用計數的垃圾回收)
3.
struct
_typeobject *ob_type
*
ob
_
type指向類型對象的指針
(
指向_typeobject
結構體)
決定了這個對象的類型
!
PyObject
定義
typedef
struct
_object
{
PyObject
_
HEAD}
PyObject
;
說明
1.
依賴關係
PyObject
->
PyObject_HEAD
結構
PyVarObject
定義
typedef
struct
{
PyObject_VAR
_
HEAD}
PyVarObject
;
#define PyObject_VAR_HEAD
PyObject_HEAD
Py_ssize_t
ob_size
;
/* Number of items in variable part */
說明
1.
依賴關係
PyVarObject
->
PyObject_VAR_HEAD
->
PyObject
_
HEAD
2.Py_ssize_t
ob_size
ob_size
,
變長對象容納的元素個數
結構
代碼關係
幾個方法
跟對象相關的方法
#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
讀取引用計數
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
獲取對象類型
#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size)
讀取元素個數
(
len
)
跟引用計數相關的方法
Py_INCREF
(
op
)
增加對象引用計數
Py_DECREF
(
op
)
減少對象引用計數
,
如果計數位
0
,
調用
_Py_Dealloc
_Py_Dealloc
(
op
)
調用對應類型的
tp
_
dealloc方法
(
每種類型回收行為不一樣的,
各種緩存池機制
,
後面看
)
其他
幾個參數涉及
ob_
refcnt引用計數
,
與內存管理/
垃圾回收相關ob
_
type類型
,
涉及
Python
的類型系統看完本文有收穫?請轉
發分享給更多人
關注「P
ython開發者」,提升Python技能
※構建多層感知器神經網路對數字圖片進行文本識別
※Gevent 調度流程解析
※為什麼你應該學 Python ?
※入門 Python 要多久?
※遺傳演算法中適值函數的標定與大變異演算法
TAG:Python開發者 |