[筆記]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