閱讀354 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[筆記]Python對象基礎

以前寫在Evernote上的筆記。

Python對象機製最基礎的是PyObject和PyVarObject,而後者又僅僅是比前者多了一個變量而已。
在object.h中有這兩者的定義:
typedef struct _object {
     PyObject_HEAD
} PyObject;

typedef struct {
     PyObject_VAR_HEAD
} PyVarObject;

同一個文件下也定義了相應的兩個宏。

可以看出Python中對象的核心在於引用計數ob_refcnt和類型對象ob_type,而可變對象則多了個可變的項的數目ob_size(比如一個list有5個元素)。

這裏出現了個新的變量:_typeobject,用來表示對象的類型。

代碼的第一行就表示類型對象也是一個可變對象,那麼類型對象也應該有類型的,定義在typeobject.c中。

宏PyObject_HEAD_INIT定義在object.h中:

由上,可知對象類型也是一種對象,為PyTypeObject,而類型對象的類型為PyType_Type,最後遞歸在此。




Python中所有的對象都繼承PyObject,內存布局中開頭都是PyObject,所以可以通過PyObject *指針來指向所有對象,進行維護、操作。
至於調用類型特有的操作,則通過ob_type這個成員來判斷。
這是Python中的繼承和多態。



另外一點就是Python的引用計數,管理資源、進行垃圾回收。
Python通過ob_refcnt這個成員來標識該對象被引用了幾次,為0時回收。
但是回收並不一定是還給操作係統,而是采用了內存對象池。
其中,類型對象是不被引用計數的。


JasonLee     2011.08.05     0:29


最後更新:2017-04-02 22:16:32

  上一篇:go 【Android】ListView與Button的共存問題解決
  下一篇:go QuickContact分析及其彈出窗口實現