一般的なオブジェクト構造
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_VARARGS と METH_KEYWORDS のみです。 呼び出し規約フラグはいずれも、バインディングフラグと組み合わせることができます。
- METH_VARARGS
- これは典型的な呼び出し規約であり、メソッドのタイプは PyCFunction です。 この関数は、2つの
PyObject*
値を想定しています。 1つ目は、メソッドの self オブジェクトです。 モジュール関数の場合、これはモジュールオブジェクトです。 2番目のパラメーター( args と呼ばれることが多い)は、すべての引数を表すタプルオブジェクトです。 このパラメーターは通常、 PyArg_ParseTuple()または PyArg_UnpackTuple()を使用して処理されます。
- METH_KEYWORDS
- これらのフラグを持つメソッドは、タイプ
PyCFunctionWithKeywords
である必要があります。 この関数は、 self 、 args 、およびすべてのキーワード引数の辞書の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_OBJECT
とT_OBJECT_EX
は、メンバーが NULL の場合、T_OBJECT
がNone
を返し、T_OBJECT_EX
が[ X122X] 。T_OBJECT_EX
はT_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 ハンドラーの実装に役立ちます。