タイプオブジェクト—Pythonドキュメント

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

タイプオブジェクト

type PyTypeObject
組み込み型を記述するために使用されるオブジェクトのC構造体。
PyTypeObject PyType_Type
これは、型オブジェクトの型オブジェクトです。 Pythonレイヤーの type と同じオブジェクトです。
int PyType_Check(PyObject *o)
オブジェクト o が型オブジェクトである場合、標準の型オブジェクトから派生した型のインスタンスを含め、ゼロ以外を返します。 それ以外の場合はすべて0を返します。 この関数は常に成功します。
int PyType_CheckExact(PyObject *o)
オブジェクト o が型オブジェクトであるが、標準型オブジェクトのサブタイプではない場合は、ゼロ以外を返します。 それ以外の場合はすべて0を返します。 この関数は常に成功します。
unsigned int PyType_ClearCache()
内部ルックアップキャッシュをクリアします。 現在のバージョンタグを返します。
unsigned long PyType_GetFlags(PyTypeObject *type)

typetp_flags メンバーを返します。 この関数は、主に Py_LIMITED_API で使用することを目的としています。 個々のフラグビットはPythonリリース間で安定していることが保証されていますが、 tp_flags 自体へのアクセスは制限付きAPIの一部ではありません。

バージョン3.2の新機能。

バージョン3.4で変更:戻りタイプがlongではなくunsigned longになりました。

void PyType_Modified(PyTypeObject *type)
タイプとそのすべてのサブタイプの内部ルックアップキャッシュを無効にします。 この関数は、タイプの属性または基本クラスを手動で変更した後に呼び出す必要があります。
int PyType_HasFeature(PyTypeObject *o, int feature)
タイプオブジェクト o が機能機能を設定する場合、ゼロ以外を返します。 タイプ機能は、シングルビットフラグで示されます。
int PyType_IS_GC(PyTypeObject *o)
タイプオブジェクトに循環検出器のサポートが含まれている場合はtrueを返します。 これは、タイプフラグ Py_TPFLAGS_HAVE_GC をテストします。
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)

ab のサブタイプである場合はtrueを返します。

この関数は実際のサブタイプのみをチェックします。つまり、 __ subclasscheck __()b では呼び出されません。 PyObject_IsSubclass()を呼び出して、 issubclass()と同じチェックを行います。

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
型オブジェクトの tp_alloc スロットのジェネリックハンドラー。 Pythonのデフォルトのメモリ割り当てメカニズムを使用して、新しいインスタンスを割り当て、そのすべてのコンテンツをNULLに初期化します。
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
型オブジェクトの tp_new スロットのジェネリックハンドラー。 タイプの tp_alloc スロットを使用して新しいインスタンスを作成します。
int PyType_Ready(PyTypeObject *type)

型オブジェクトを完成させます。 これは、初期化を完了するためにすべての型オブジェクトで呼び出す必要があります。 この関数は、型の基本クラスから継承されたスロットを追加する役割を果たします。 成功した場合は0を返すか、-1を返してエラーの場合は例外を設定します。

ノート

一部の基本クラスがGCプロトコルを実装し、提供されたタイプのフラグに Py_TPFLAGS_HAVE_GC が含まれていない場合、GCプロトコルはその親から自動的に実装されます。 逆に、作成される型のフラグに Py_TPFLAGS_HAVE_GC が含まれている場合は、少なくとも tp_traverse ハンドルを実装することにより、GCプロトコル自体を実装する必要があります

void *PyType_GetSlot(PyTypeObject *type, int slot)

指定されたスロットに格納されている関数ポインタを返します。 結果がNULLの場合、スロットがNULLであるか、関数が無効なパラメーターで呼び出されたことを示しています。 呼び出し元は通常、結果ポインターを適切な関数型にキャストします。

slot 引数の可能な値については、PyType_Slot.slotを参照してください。

type がヒープタイプでない場合は例外が発生します。

バージョン3.4の新機能。

PyObject *PyType_GetModule(PyTypeObject *type)

PyType_FromModuleAndSpec()を使用してタイプが作成されたときに、指定されたタイプに関連付けられたモジュールオブジェクトを返します。

指定されたタイプに関連付けられているモジュールがない場合は、 TypeError を設定し、NULLを返します。

この関数は通常、メソッドが定義されているモジュールを取得するために使用されます。 このような方法では、PyType_GetModule(Py_TYPE(self))が意図した結果を返さない場合があることに注意してください。 Py_TYPE(self)は、目的のクラスのサブクラスである可能性があり、サブクラスは必ずしもスーパークラスと同じモジュールで定義されているとは限りません。 メソッドを定義するクラスを取得するには、 PyCMethod を参照してください。

バージョン3.9の新機能。

void *PyType_GetModuleState(PyTypeObject *type)

指定されたタイプに関連付けられているモジュールオブジェクトの状態を返します。 これは、 PyType_GetModule()の結果に対して PyModule_GetState()を呼び出すためのショートカットです。

指定されたタイプに関連付けられているモジュールがない場合は、 TypeError を設定し、NULLを返します。

type に関連するモジュールがあるが、その状態がNULLの場合、例外を設定せずにNULLを返します。

バージョン3.9の新機能。

ヒープ割り当て型の作成

次の関数と構造体を使用して、ヒープタイプを作成します。

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)

specPy_TPFLAGS_HEAPTYPE )からヒープタイプオブジェクトを作成して返します。

bases がタプルの場合、作成されたヒープタイプには、ベースタイプとして含まれているすべてのタイプが含まれます。

basesNULLの場合、代わりに Py_tp_bases スロットが使用されます。 それがNULLでもある場合は、代わりに Py_tp_base スロットが使用されます。 それもNULLの場合、新しいタイプはオブジェクトから派生します。

module 引数を使用して、新しいクラスが定義されているモジュールを記録できます。 モジュールオブジェクトまたはNULLである必要があります。 NULLでない場合、モジュールは新しいタイプに関連付けられ、後で PyType_GetModule()で取得できます。 関連するモジュールはサブクラスに継承されません。 クラスごとに個別に指定する必要があります。

この関数は、新しいタイプで PyType_Ready()を呼び出します。

バージョン3.9の新機能。

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)

PyType_FromModuleAndSpec(NULL, spec, bases)と同等です。

バージョン3.3の新機能。

PyObject *PyType_FromSpec(PyType_Spec *spec)
PyType_FromSpecWithBases(spec, NULL)と同等です。
type PyType_Spec

タイプの動作を定義する構造。

const char *PyType_Spec.name

PyTypeObject.tp_name の設定に使用されるタイプの名前。

int PyType_Spec.basicsize
int PyType_Spec.itemsize

PyTypeObject.tp_basicsize および PyTypeObject.tp_itemsize の設定に使用されるインスタンスのバイト単位のサイズ。

int PyType_Spec.flags

PyTypeObject.tp_flags を設定するために使用されるタイプフラグ。

Py_TPFLAGS_HEAPTYPEフラグが設定されていない場合、 PyType_FromSpecWithBases()は自動的に設定します。

PyType_Slot *PyType_Spec.slots

PyType_Slot 構造体の配列。 特別なスロット値{0, NULL}で終了します。

type PyType_Slot

スロットIDと値ポインターを含む、タイプのオプション機能を定義する構造。

int PyType_Slot.slot

スロットID。

スロットIDは、構造体 PyTypeObjectPyNumberMethodsPySequenceMethodsPyMappingMethodsPyAsyncMethods のフィールド名と同じように名前が付けられます。 Py_プレフィックスが追加されています。 たとえば、次を使用します。

PyType_Spec およびPyType_Slotを使用して、次のフィールドを設定することはできません。

制限付きAPIでは、 PyType_Spec およびPyType_Slotを使用して次のフィールドを設定することはできません。

一部のプラットフォームでは、Py_tp_basesまたはPy_tp_baseの設定に問題がある場合があります。 問題を回避するには、代わりにPyType_FromSpecWithBases()bases 引数を使用してください。

バージョン3.9で変更: PyBufferProcsスロットが無制限のAPIで設定される場合があります。

void *PyType_Slot.pfunc

スロットの望ましい値。 ほとんどの場合、これは関数へのポインターです。

NULLではない可能性があります。