一般的なオブジェクト構造
Pythonのオブジェクトタイプの定義で使用される構造は多数あります。 このセクションでは、これらの構造とその使用方法について説明します。
すべてのPythonオブジェクトは、最終的に、メモリ内のオブジェクトの表現の先頭で少数のフィールドを共有します。 これらは、 PyObject および PyVarObject タイプによって表されます。これらは、他のすべてのPythonの定義で、直接的または間接的に使用されるいくつかのマクロの展開によって定義されます。オブジェクト。
- type PyObject
- すべてのオブジェクトタイプは、このタイプの拡張です。 これは、Pythonがオブジェクトへのポインタをオブジェクトとして扱うために必要な情報を含むタイプです。 通常の「リリース」ビルドでは、オブジェクトの参照カウントと対応するタイプオブジェクトへのポインタのみが含まれます。 実際には PyObject として宣言されているものはありませんが、Pythonオブジェクトへのすべてのポインターを
PyObject*
にキャストできます。 メンバーへのアクセスは、マクロ Py_REFCNT および Py_TYPE を使用して行う必要があります。
- type PyVarObject
- これは PyObject の拡張であり、
ob_size
フィールドを追加します。 これは、長さの概念を持つオブジェクトにのみ使用されます。 このタイプは、Python / CAPIにはあまり表示されません。 メンバーへのアクセスは、マクロ Py_REFCNT 、 Py_TYPE 、および Py_SIZE を使用して行う必要があります。
- PyObject_HEAD
これは、長さを変えずにオブジェクトを表す新しい型を宣言するときに使用されるマクロです。 PyObject_HEADマクロは次のように展開されます。
上記の PyObject のドキュメントを参照してください。
- PyObject_VAR_HEAD
これは、インスタンスごとに異なる長さのオブジェクトを表す新しい型を宣言するときに使用されるマクロです。 PyObject_VAR_HEADマクロは次のように展開されます。
上記の PyVarObject のドキュメントを参照してください。
- Py_TYPE(o)
このマクロは、Pythonオブジェクトの
ob_type
メンバーにアクセスするために使用されます。 次のように展開されます。
- Py_REFCNT(o)
このマクロは、Pythonオブジェクトの
ob_refcnt
メンバーにアクセスするために使用されます。 次のように展開されます。
- Py_SIZE(o)
このマクロは、Pythonオブジェクトの
ob_size
メンバーにアクセスするために使用されます。 次のように展開されます。
- PyObject_HEAD_INIT(type)
これは、新しい PyObject タイプの初期化値に展開されるマクロです。 このマクロは次のように展開されます。
- PyVarObject_HEAD_INIT(type, size)
これは、
ob_size
フィールドを含む新しい PyVarObject タイプの初期化値に展開されるマクロです。 このマクロは次のように展開されます。
- type PyCFunction
- ほとんどのPython呼び出し可能オブジェクトをCで実装するために使用される関数のタイプ。 このタイプの関数は、2つの
PyObject*
パラメーターを取り、そのような値を1つ返します。 戻り値が NULL の場合、例外が設定されている必要があります。 NULL でない場合、戻り値はPythonで公開されている関数の戻り値として解釈されます。 関数は新しい参照を返す必要があります。
- type PyCFunctionWithKeywords
- キーワード引数を取るCでPython呼び出し可能オブジェクトを実装するために使用される関数のタイプ:3つの
PyObject*
パラメーターを取り、そのような値を1つ返します。 戻り値の意味については、上記の PyCFunction を参照してください。
- 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*
パラメーターが単一の引数を表します。
これらの2つの定数は、呼び出し規約を示すために使用されるのではなく、クラスのメソッドで使用する場合のバインディングを示します。 これらは、モジュール用に定義された関数には使用できません。 これらのフラグの最大1つは、任意のメソッドに設定できます。
- METH_CLASS
- メソッドには、型のインスタンスではなく、最初のパラメーターとして型オブジェクトが渡されます。 これは、 classmethod()組み込み関数を使用するときに作成されるものと同様に、クラスメソッドを作成するために使用されます。
- METH_STATIC
- メソッドには、型のインスタンスではなく、最初のパラメーターとして NULL が渡されます。 これは、 staticmethod()組み込み関数を使用するときに作成されるものと同様に、 staticメソッドを作成するために使用されます。
もう1つの定数は、同じメソッド名を持つ別の定義の代わりにメソッドをロードするかどうかを制御します。
- METH_COEXIST
- メソッドは、既存の定義の代わりにロードされます。 METH_COEXIST がない場合、デフォルトでは繰り返し定義をスキップします。 スロットラッパーはメソッドテーブルの前にロードされるため、たとえば sq_contains スロットが存在すると、
__contains__()
という名前のラップされたメソッドが生成され、同じ名前の対応するPyCFunctionのロードができなくなります。 。 フラグを定義すると、ラッパーオブジェクトの代わりにPyCFunctionがロードされ、スロットと共存します。 PyCFunctionsの呼び出しは、ラッパーオブジェクトの呼び出しよりも最適化されているため、これは便利です。
- 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] AttributeError 。T_OBJECT_EX
はT_OBJECT
よりもその属性での del ステートメントの使用をより正確に処理するため、T_OBJECT
ではなくT_OBJECT_EX
を使用してみてください。flags
は、書き込みおよび読み取りアクセスの場合は0
、読み取り専用アクセスの場合はREADONLY
になります。 タイプにT_STRING
を使用すると、READONLY
を意味します。T_STRING
データはUTF-8として解釈されます。T_OBJECT
およびT_OBJECT_EX
メンバーのみを削除できます。 ( NULL に設定されています)。
- type PyGetSetDef
タイプのプロパティのようなアクセスを定義する構造。 PyTypeObject.tp_getset スロットの説明も参照してください。
分野
Cタイプ
意味
名前
char *
属性名
得る
ゲッター
属性を取得するC関数
設定
セッター
属性を設定または削除するオプションのC関数。省略した場合、属性は読み取り専用です。
doc
char *
オプションのdocstring
閉鎖
空所 *
オプションの関数ポインタ。ゲッターとセッターに追加データを提供します
get
関数は、1つのPyObject*
パラメーター(インスタンス)と関数ポインター(関連するclosure
)を取ります。成功した場合は新しい参照を返すか、失敗した場合は例外を設定して NULL を返す必要があります。
set
関数は、2つのPyObject*
パラメーター(インスタンスと設定する値)と関数ポインター(関連するclosure
)を取ります。属性を削除する必要がある場合、2番目のパラメーターは NULL です。 成功した場合は
0
を返し、失敗した場合は例外を設定して-1
を返す必要があります。