一般的なオブジェクト構造—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/c-api/structures
移動先:案内検索

一般的なオブジェクト構造

Pythonのオブジェクトタイプの定義で使用される構造は多数あります。 このセクションでは、これらの構造とその使用方法について説明します。

すべてのPythonオブジェクトは、最終的に、メモリ内のオブジェクトの表現の先頭で少数のフィールドを共有します。 これらは、 PyObject および PyVarObject タイプによって表されます。これらは、他のすべてのPythonの定義で、直接的または間接的に使用されるいくつかのマクロの展開によって定義されます。オブジェクト。

type PyObject
すべてのオブジェクトタイプは、このタイプの拡張です。 これは、Pythonがオブジェクトへのポインタをオブジェクトとして扱うために必要な情報を含むタイプです。 通常の「リリース」ビルドでは、オブジェクトの参照カウントと対応するタイプオブジェクトへのポインタのみが含まれます。 PyObject_HEADマクロの展開で定義されたフィールドに対応します。
type PyVarObject
これは PyObject の拡張であり、ob_sizeフィールドを追加します。 これは、長さの概念を持つオブジェクトにのみ使用されます。 このタイプは、Python / CAPIにはあまり表示されません。 PyObject_VAR_HEADマクロの展開で定義されたフィールドに対応します。

これらのマクロは、 PyObject および PyVarObject の定義で使用されます。

PyObject_HEAD

これは、 PyObject タイプのフィールドの宣言に展開されるマクロです。 これは、長さを変えずにオブジェクトを表す新しい型を宣言するときに使用されます。 Py_TRACE_REFSの定義に応じて展開される特定のフィールド。 デフォルトでは、そのマクロは定義されておらず、 PyObject_HEAD は次のように展開されます。

Py_ssize_t ob_refcnt;
PyTypeObject *ob_type;

Py_TRACE_REFSが定義されると、次のように展開されます。

PyObject *_ob_next, *_ob_prev;
Py_ssize_t ob_refcnt;
PyTypeObject *ob_type;
PyObject_VAR_HEAD

これは、 PyVarObject タイプのフィールドの宣言に展開されるマクロです。 これは、インスタンスごとに異なる長さのオブジェクトを表す新しい型を宣言するときに使用されます。 このマクロは常に次のように展開されます。

PyObject_HEAD
Py_ssize_t ob_size;

PyObject_HEAD は拡張の一部であり、それ自体の拡張はPy_TRACE_REFSの定義によって異なることに注意してください。

Py_TYPE(o)

このマクロは、Pythonオブジェクトのob_typeメンバーにアクセスするために使用されます。 次のように展開されます。

(((PyObject*)(o))->ob_type)

バージョン2.6の新機能。

Py_REFCNT(o)

このマクロは、Pythonオブジェクトのob_refcntメンバーにアクセスするために使用されます。 次のように展開されます。

(((PyObject*)(o))->ob_refcnt)

バージョン2.6の新機能。

Py_SIZE(o)

このマクロは、Pythonオブジェクトのob_sizeメンバーにアクセスするために使用されます。 次のように展開されます。

(((PyVarObject*)(o))->ob_size)

バージョン2.6の新機能。

PyObject_HEAD_INIT(type)

これは、新しい PyObject タイプの初期化値に展開されるマクロです。 このマクロは次のように展開されます。

_PyObject_EXTRA_INIT
1, type,
PyVarObject_HEAD_INIT(type, size)

これは、ob_sizeフィールドを含む新しい PyVarObject タイプの初期化値に展開されるマクロです。 このマクロは次のように展開されます。

_PyObject_EXTRA_INIT
1, type, size,
type PyCFunction
ほとんどのPython呼び出し可能オブジェクトをCで実装するために使用される関数のタイプ。 このタイプの関数は、2つのPyObject*パラメーターを取り、そのような値を1つ返します。 戻り値が NULL の場合、例外が設定されている必要があります。 NULL でない場合、戻り値はPythonで公開されている関数の戻り値として解釈されます。 関数は新しい参照を返す必要があります。
type PyMethodDef

拡張タイプのメソッドを記述するために使用される構造。 この構造には4つのフィールドがあります。

分野

Cタイプ

意味

ml_name

char *

メソッドの名前

ml_meth

PyCFunction

C実装へのポインタ

ml_flags

int

呼び出しの構成方法を示すフラグビット

ml_doc

char *

docstringの内容を指します

ml_methはC関数ポインタです。 関数はさまざまなタイプである可能性がありますが、常にPyObject*を返します。 関数が PyCFunction のものでない場合、コンパイラーはメソッドテーブルでのキャストを必要とします。 PyCFunction は最初のパラメーターをPyObject*として定義していますが、メソッドの実装では self オブジェクトの特定のCタイプを使用するのが一般的です。

ml_flagsフィールドは、次のフラグを含めることができるビットフィールドです。 個々のフラグは、呼び出し規約またはバインディング規約のいずれかを示します。 呼び出し規約フラグのうち、組み合わせることができるのは METH_VARARGSMETH_KEYWORDS のみです。 呼び出し規約フラグはいずれも、バインディングフラグと組み合わせることができます。

METH_VARARGS
これは典型的な呼び出し規約であり、メソッドのタイプは PyCFunction です。 この関数は、2つのPyObject*値を想定しています。 1つ目は、メソッドの self オブジェクトです。 モジュール関数の場合、これはモジュールオブジェクトです。 2番目のパラメーター( args と呼ばれることが多い)は、すべての引数を表すタプルオブジェクトです。 このパラメーターは通常、 PyArg_ParseTuple()または PyArg_UnpackTuple()を使用して処理されます。
METH_KEYWORDS
これらのフラグを持つメソッドは、タイプPyCFunctionWithKeywordsである必要があります。 この関数は、 selfargs 、およびすべてのキーワード引数の辞書の3つのパラメーターを必要とします。 フラグは通常 METH_VARARGS と組み合わされ、パラメーターは通常 PyArg_ParseTupleAndKeywords()を使用して処理されます。
METH_NOARGS
パラメータのないメソッドは、 METH_NOARGS フラグが付いている場合、引数が指定されているかどうかを確認する必要はありません。 タイプは PyCFunction である必要があります。 最初のパラメータは通常selfという名前で、モジュールまたはオブジェクトインスタンスへの参照を保持します。 すべての場合において、2番目のパラメーターは NULL になります。
METH_O
"O"引数で PyArg_ParseTuple()を呼び出す代わりに、単一のオブジェクト引数を持つメソッドを METH_O フラグでリストできます。 タイプは PyCFunction で、 self パラメーターと、PyObject*パラメーターが単一の引数を表します。
METH_OLDARGS
この呼び出し規約は非推奨です。 メソッドは PyCFunction タイプである必要があります。 2番目の引数は、引数が指定されていない場合は NULL 、引数が1つだけ指定されている場合は単一のオブジェクト、複数の引数が指定されている場合はオブジェクトのタプルです。 この規則を使用する関数が、複数の引数を持つ呼び出しと、唯一の引数としてタプルを持つ呼び出しを区別する方法はありません。

これらの2つの定数は、呼び出し規約を示すために使用されるのではなく、クラスのメソッドで使用する場合のバインディングを示します。 これらは、モジュール用に定義された関数には使用できません。 これらのフラグの最大1つは、任意のメソッドに設定できます。

METH_CLASS

メソッドには、型のインスタンスではなく、最初のパラメーターとして型オブジェクトが渡されます。 これは、 classmethod()組み込み関数を使用するときに作成されるものと同様に、クラスメソッドを作成するために使用されます。

バージョン2.3の新機能。

METH_STATIC

メソッドには、型のインスタンスではなく、最初のパラメーターとして NULL が渡されます。 これは、 staticmethod()組み込み関数を使用するときに作成されるものと同様に、 staticメソッドを作成するために使用されます。

バージョン2.3の新機能。

もう1つの定数は、同じメソッド名を持つ別の定義の代わりにメソッドをロードするかどうかを制御します。

METH_COEXIST

メソッドは、既存の定義の代わりにロードされます。 METH_COEXIST がない場合、デフォルトでは繰り返し定義をスキップします。 スロットラッパーはメソッドテーブルの前にロードされるため、たとえば sq_contains スロットが存在すると、__contains__()という名前のラップされたメソッドが生成され、同じ名前の対応するPyCFunctionのロードができなくなります。 。 フラグを定義すると、ラッパーオブジェクトの代わりにPyCFunctionがロードされ、スロットと共存します。 PyCFunctionsの呼び出しは、ラッパーオブジェクトの呼び出しよりも最適化されているため、これは便利です。

バージョン2.4の新機能。

type PyMemberDef

C構造体メンバーに対応する型の属性を記述する構造体。 そのフィールドは次のとおりです。

分野

Cタイプ

意味

name

char *

メンバーの名前

type

int

C構造体のメンバーのタイプ

offset

Py_ssize_t

メンバーが型のオブジェクト構造体に配置されているバイト単位のオフセット

flags

int

フィールドを読み取り専用にするか書き込み可能にするかを示すフラグビット

doc

char *

docstringの内容を指します

typeは、さまざまなCタイプに対応する多くのT_マクロの1つです。 メンバーがPythonでアクセスされると、同等のPythonタイプに変換されます。

マクロ名

Cタイプ

T_SHORT

短い

T_INT

int

T_LONG

長いです

T_FLOAT

浮く

T_DOUBLE

ダブル

T_STRING

char *

T_OBJECT

PyObject *

T_OBJECT_EX

PyObject *

T_CHAR

char

T_BYTE

char

T_UBYTE

unsigned char

T_UINT

unsigned int

T_USHORT

署名されていない短い

T_ULONG

unsigned long

T_BOOL

char

T_LONGLONG

長い長い

T_ULONGLONG

unsigned long long

T_PYSSIZET

Py_ssize_t

T_OBJECTT_OBJECT_EXは、メンバーが NULL の場合、T_OBJECTNoneを返し、T_OBJECT_EXが[ X122X] 。 T_OBJECT_EXT_OBJECTよりもその属性での del ステートメントの使用をより正確に処理するため、T_OBJECTではなくT_OBJECT_EXを使用してみてください。

flagsは、書き込みおよび読み取りアクセスの場合は0、読み取り専用アクセスの場合はREADONLYになります。 タイプT_STRINGを使用すると、READONLYを意味します。 T_OBJECTおよびT_OBJECT_EXメンバーのみを削除できます。 ( NULL に設定されています)。

type PyGetSetDef

タイプのプロパティのようなアクセスを定義する構造。 PyTypeObject.tp_getset スロットの説明も参照してください。

分野

Cタイプ

意味

名前

char *

属性名

得る

ゲッター

属性を取得するC関数

設定

セッター

属性を設定または削除するオプションのC関数。省略した場合、属性は読み取り専用です。

doc

char *

オプションのdocstring

閉鎖

空所 *

オプションの関数ポインタ。ゲッターとセッターに追加データを提供します

get関数は、1つのPyObject*パラメーター(インスタンス)と関数ポインター(関連するclosure)を取ります。

typedef PyObject *(*getter)(PyObject *, void *);

成功した場合は新しい参照を返すか、失敗した場合は例外を設定して NULL を返す必要があります。

set関数は、2つのPyObject*パラメーター(インスタンスと設定する値)と関数ポインター(関連するclosure)を取ります。

typedef int (*setter)(PyObject *, PyObject *, void *);

属性を削除する必要がある場合、2番目のパラメーターは NULL です。 成功した場合は0を返し、失敗した場合は例外を設定して-1を返す必要があります。

PyObject *Py_FindMethod(PyMethodDef table[], PyObject *ob, char *name)
Cで実装された拡張タイプのバインドされたメソッドオブジェクトを返します。 これは、 PyObject_GenericGetAttr()関数を使用しない tp_getattro または tp_getattr ハンドラーの実装に役立ちます。