5

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 *がPythonの各オブジェクト(PyIntObject、PyVarObjectなど)を指すことができるのかということです。

4

2 に答える 2

10

さまざまなタイプのPythonオブジェクトの各構造体には、PyObject_HEAD最初のメンバー(または最初のメンバーの最初のメンバーなど)としてのインスタンスがあります。

このメンバーサブオブジェクトは、完全なオブジェクトと同じアドレスに配置されることが保証されています。

そのメンバーサブオブジェクトのポイントですが、完全なタイプが何であるかを理解するために検査されたら、完全なPyObject_HEAD*タイプにキャストできます。ob_type

このトリックはCPythonに固有のものではありません。これは、Cで限定された種類の継承を実装するためによく使用されます。基本的に、「最初にXがある」によって「Xである」関係をモデル化します。

于 2012-07-31T09:33:59.577 に答える
2

PyObject_HEADは常に、具体的な基になる型の影響を受けない最初の構造体メンバーであるためです。もちろん、ポインターはキャストされます。

于 2012-07-31T09:16:45.203 に答える