當前位置:
首頁 > 知識 > Python 源碼閱讀:對象

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技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

構建多層感知器神經網路對數字圖片進行文本識別
Gevent 調度流程解析
為什麼你應該學 Python ?
入門 Python 要多久?
遺傳演算法中適值函數的標定與大變異演算法

TAG:Python開發者 |