2012-07-31 28 views
4

在python的源代碼,也有一些像這樣的宏定義:爲什麼PyObject *可以指向python中的任何對象?

#define PyObject_HEAD \ 
    int ob_refcnt;  \ 
    struct _typeobject *ob_type; 


#define PyObject_VAR_HEAD \ 
    PyObject_HEAD   \ 
    int ob_size; 


typedef struct _object { 
    PyObject_HEAD 
} PyObject;  

typedef struct _object { 
    PyObject_HEAD 
    long ob_ival; 
} PyIntObject; 

typedef struct { 
    PyObject_VAR_HEAD 
} PyVarObject; 

的問題是,爲什麼的PyObject *可以指向每個對象(如PyIntObject,PyVarObject)在Python?

+1

宏定義中是否缺少一些反斜槓? – Jens 2012-07-31 09:20:43

+0

是的......我忘了那個...... – 2012-07-31 09:50:19

+0

我編輯它後現在看起來是否正確? – Jens 2012-07-31 11:04:54

回答

7

不同類型的Python對象的每個結構都有一個PyObject_HEAD的實例作爲其第一個成員(或其第一個成員的第一個成員,等等)。

該成員子對象保證位於與完整對象相同的地址。

PyObject_HEAD*指向該成員的子對象,但是一旦檢測到ob_type以確定完整類型是什麼,則可以將其轉換爲完整類型。

這個竅門並不是CPython獨有的 - 它經常被用來在C中實現有限類型的繼承。基本上你通過「在開頭有一個X」來建模「是X」關係。

2

因爲PyObject_HEAD始終是第一個不受具體基礎類型影響的結構成員。指針將會被鑄造。

相關問題