型オブジェクト¶
-
type PyTypeObject¶
- 次に属します: Stable ABI (不透明な構造体として).
組み込み型を記述する際に用いられる、オブジェクトを表す C 構造体です。
-
PyTypeObject PyType_Type¶
- 次に属します: Stable ABI.
型オブジェクト自身の型オブジェクトです。Python レイヤにおける
typeと同じオブジェクトです。
-
int PyType_Check(PyObject *o)¶
オブジェクト o が型オブジェクトであれば、標準の型オブジェクトから派生した型のインスタンスも含めてゼロ以外を返します。 それ以外の場合は 0 を返します。 この関数は常に成功します。
-
int PyType_CheckExact(PyObject *o)¶
オブジェクト o が標準の型オブジェクトのインスタンスであり、そのサブタイプのインスタンスではない場合にゼロ以外を返します。 それ以外の場合は 0 を返します。 この関数は常に成功します。
-
unsigned int PyType_ClearCache()¶
- 次に属します: Stable ABI.
内部の検索キャッシュをクリアします。現在のバージョンタグを返します。
-
unsigned long PyType_GetFlags(PyTypeObject *type)¶
- 次に属します: Stable ABI.
type の
tp_flagsメンバーを返します。 この関数は主にPy_LIMITED_APIで使うことを想定しています。 個々のフラグビットは Python のリリース間で安定していることが保証されますが、tp_flags自体へのアクセスは Limited API の一部ではありません。Added in version 3.2.
バージョン 3.4 で変更: 返り値の型が
longではなくunsigned longになりました。
-
PyObject *PyType_GetDict(PyTypeObject *type)¶
型オブジェクトの内部の名前空間を返します。 通常は読み取り専用のプロキシ (
cls.__dict__) を通じてのみ公開されるものです。tp_dictに直接アクセスする代わりに使えます。 返された辞書は読み取り専用として扱わなければなりません。この関数は、辞書への直接アクセスが必要で、プロキシや
PyObject_GetAttr()などによる間接アクセスでは不十分な、特定の埋め込みや言語バインディングの用途を想定しています。拡張モジュールで独自の型を設定するときは、引き続き直接または間接的に
tp_dictを使ってください。Added in version 3.12.
-
void PyType_Modified(PyTypeObject *type)¶
- 次に属します: Stable ABI.
内部の検索キャッシュを、その type とすべてのサブタイプに対して無効にします。この関数は type の属性や基底クラス列を変更したあとに手動で呼び出さなければなりません。
-
int PyType_AddWatcher(PyType_WatchCallback callback)¶
callback を型ウォッチャーとして登録します。 ゼロ以上の整数 ID を返します。 以後
PyType_Watch()を呼び出すときには、この ID を渡す必要があります。 エラー時 (例えば利用可能なウォッチャー ID が残っていない場合) は、例外を設定して-1を返します。フリースレッドビルドでは
PyType_AddWatcher()はスレッドセーフではないため、起動時 (最初のスレッドを作成する前) に呼び出さなければなりません。Added in version 3.12.
-
int PyType_ClearWatcher(int watcher_id)¶
watcher_id (
PyType_AddWatcher()が以前返した値) で指定したウォッチャーを解除します。 成功すると0、エラー時 (例えば watcher_id が一度も登録されていない場合) は-1を返します。拡張モジュールは、以前
PyType_AddWatcher()の呼び出しで受け取ったものでない watcher_id を渡してPyType_ClearWatcherを呼び出してはいけません。Added in version 3.12.
-
int PyType_Watch(int watcher_id, PyObject *type)¶
type を監視対象にします。
PyType_Modified()が type の変更を報告するたびに、PyType_AddWatcher()から watcher_id を割り当てられたコールバックが呼び出されます。 ただし、type に対する一連の変更の間に_PyType_Lookup()が呼び出されなければ、コールバックは 1 度だけ呼び出されることがあります。 これは実装詳細であり、変更される可能性があります。監視対象のヒープ型が解放されるときにも、コールバックが呼び出されます。
拡張モジュールは、以前
PyType_AddWatcher()の呼び出しで受け取ったものでない watcher_id を渡してPyType_Watchを呼び出してはいけません。Added in version 3.12.
バージョン 3.15 で変更: 監視対象のヒープ型が解放されるときにも、コールバックが呼び出されるようになりました。
-
int PyType_Unwatch(int watcher_id, PyObject *type)¶
type を監視対象から外します。 以前の
PyType_Watch()の呼び出しを取り消します。 type はNULLであってはいけません。拡張モジュールは、以前
PyType_AddWatcher()の呼び出しで受け取ったものでない watcher_id を渡して、この関数を呼び出してはいけません。成功すると
0を返します。 失敗すると例外を設定して-1を返します。Added in version 3.12.
-
typedef int (*PyType_WatchCallback)(PyObject *type)¶
型ウォッチャーのコールバック関数の型。
コールバックは type を変更したり、type またはその MRO 内の型に対して
PyType_Modified()が呼び出されるようにしたりしてはいけません。 この規則に違反すると、無限再帰を引き起こす可能性があります。コールバックは型の解放中に呼び出されることがあります。 その場合、型オブジェクトは一時的に復活しており (参照カウントは 1 以上)、すべての属性がまだ有効です。 ただし、型への新しい強参照をコールバックで保存してはいけません。 オブジェクトを復活させ、解放を妨げてしまうためです。
Added in version 3.12.
バージョン 3.15 で変更: 監視対象のヒープ型の解放中にも、コールバックが呼び出される可能性があるようになりました。
-
int PyType_HasFeature(PyTypeObject *o, int feature)¶
型オブジェクト o に機能 feature が設定されていれば、ゼロ以外を返します。 型の機能は、それぞれ 1 ビットのフラグで表します。
-
int PyType_FastSubclass(PyTypeObject *type, int flag)¶
型オブジェクト type にサブクラスフラグ flag が設定されていれば、ゼロ以外を返します。 サブクラスフラグは
Py_TPFLAGS_*_SUBCLASSで表します。 この関数は、一般的な型の多くの_Check関数で使われています。参考
PyObject_TypeCheck()は、サブクラスフラグのない型の_Check関数で、より低速な代替として使われます。
-
int PyType_IS_GC(PyTypeObject *o)¶
型オブジェクトが循環参照の検出をサポートしている場合に真を返します。 型のフラグ
Py_TPFLAGS_HAVE_GCを調べます。
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)¶
- 次に属します: Stable ABI.
a が b のサブタイプの場合に真を返します。
この関数が調べるのは実際のサブタイプ関係だけで、b の
__subclasscheck__()は呼び出しません。issubclass()と同じ検査を行うにはPyObject_IsSubclass()を呼び出してください。
-
PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
型オブジェクトの
tp_allocスロット用の汎用ハンドラです。 Python のデフォルトのメモリ割り当て機構を使って新しいインスタンスのメモリを割り当て、ゼロで埋めてから、PyObject_Init()またはPyObject_InitVar()を呼び出すのと同じように初期化します。オブジェクトのメモリを割り当てるためにこれを直接呼び出してはいけません。 代わりに型の
tp_allocスロットを呼び出してください。ガベージコレクションをサポートする型 (
Py_TPFLAGS_HAVE_GCフラグが設定されているもの) では、PyObject_GC_NewまたはPyObject_GC_NewVarと同様に動作し、tp_freeに設定したPyObject_GC_Del()と組み合わせて使う必要があります。 それ以外の型では、PyObject_NewまたはPyObject_NewVarと同様に動作し、tp_freeに設定したPyObject_Free()と組み合わせて使う必要があります。 いずれの場合も、初期化前にメモリがゼロで埋められることが保証される点が異なります。
-
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
型オブジェクトの
tp_newスロット用の汎用ハンドラです。 型のtp_allocスロットを使って新しいインスタンスを作成し、作成したオブジェクトを返します。
-
int PyType_Ready(PyTypeObject *type)¶
- 次に属します: Stable ABI.
型オブジェクトの初期化を完了します。 すべての型オブジェクトについて、初期化を仕上げるために呼び出す必要があります。 この関数は、型の基底クラスから継承するスロットを追加します。 成功すると
0を返し、エラー時は例外を設定して-1を返します。注釈
基底クラスのいずれかが GC プロトコルを実装しており、指定した型のフラグに
Py_TPFLAGS_HAVE_GCが含まれていなければ、GC プロトコルの実装が基底クラスから自動的に継承されます。 一方、作成する型のフラグにPy_TPFLAGS_HAVE_GCが含まれている場合は、少なくともtp_traverseハンドラを実装して、自分で GC プロトコルを実装 しなければなりません。
-
PyObject *PyType_GetName(PyTypeObject *type)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.11 より).
型の名前を返します。 型の
__name__属性の取得と同等です。Added in version 3.11.
-
PyObject *PyType_GetQualName(PyTypeObject *type)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.11 より).
型の修飾名を返します。 型の
__qualname__属性の取得と同等です。Added in version 3.11.
-
PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)¶
- 次に属します: Stable ABI (バージョン 3.13 より).
型の完全修飾名を返します。
f"{type.__module__}.{type.__qualname__}"と同等ですが、type.__module__が文字列でないか"builtins"の場合はtype.__qualname__と同等です。Added in version 3.13.
-
PyObject *PyType_GetModuleName(PyTypeObject *type)¶
- 次に属します: Stable ABI (バージョン 3.13 より).
型のモジュール名を返します。
type.__module__属性の取得と同等です。Added in version 3.13.
-
void *PyType_GetSlot(PyTypeObject *type, int slot)¶
- 次に属します: Stable ABI (バージョン 3.4 より).
与えられたスロットに格納されている関数ポインタを返します。返り値が
NULLの場合は、スロットがNULLか、関数が不正な引数で呼ばれたことを示します。通常、呼び出し側は返り値のポインタを適切な関数型にキャストします。slot 引数に指定できる値は
PyType_Slot.slotを参照してください。Added in version 3.4.
バージョン 3.10 で変更:
PyType_GetSlot()がすべての型を受け付けるようになりました。 以前は ヒープ型 に限られていました。
-
PyObject *PyType_GetModule(PyTypeObject *type)¶
- 戻り値: 借用参照。 次に属します: Stable ABI (バージョン 3.10 より).
PyType_FromModuleAndSpec()で型を作成したときに、その型に関連付けたモジュールオブジェクトを返します。返される参照は type からの 借用参照 で、type への参照を保持している間は有効です。
Py_DECREF()などで解放しないでください。指定された型にモジュールが関連付けられていない場合は、
TypeErrorを設定してNULLを返します。この関数は通常、メソッドの定義元のモジュールを取得するために使います。 そのようなメソッド内で
PyType_GetModule(Py_TYPE(self))を呼び出しても、意図した結果にならない場合がある点に注意してください。Py_TYPE(self)は意図したクラスの サブクラス である可能性があり、サブクラスは基底クラスと同じモジュールで定義されているとは限りません。 メソッドを定義しているクラスを取得する方法はPyCMethodを参照してください。PyCMethodを使えない場合はPyType_GetModuleByToken()を参照してください。Added in version 3.9.
-
void *PyType_GetModuleState(PyTypeObject *type)¶
- 次に属します: Stable ABI (バージョン 3.10 より).
指定された型に関連付けられたモジュールオブジェクトの状態を返します。
PyType_GetModule()の結果に対してPyModule_GetState()を呼び出す処理の短縮形です。指定された型にモジュールが関連付けられていない場合は、
TypeErrorを設定してNULLを返します。type にモジュールが関連付けられていても、その状態が
NULLの場合は、例外を設定せずにNULLを返します。Added in version 3.9.
-
PyObject *PyType_GetModuleByToken(PyTypeObject *type, const void *mod_token)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.15 より).
モジュールが指定された モジュールトークン を持つ最初の基底クラスを探し、そのモジュールを返します。
モジュールが見つからない場合は、
TypeErrorを送出してNULLを返します。この関数は、
tp_initやnb_addなどのスロットメソッドや、PyCMethod呼び出し規約でメソッドの定義元クラスを渡せない場所で、PyModule_GetState()と組み合わせてモジュール状態を取得するために使うことを想定しています。Added in version 3.15.
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)¶
- 戻り値: 借用参照。 次に属します: Stable ABI (バージョン 3.13 より).
モジュールが指定された
PyModuleDefdef から作成されたか、モジュールトークン が def と等しい最初の基底クラスを探し、そのモジュールを返します。PyModuleDefから作成されたモジュールでは、トークンは常にそのPyModuleDefのアドレスに設定されます。 つまり、この関数は次の点を除いてPyType_GetModuleByToken()と同等です。借用参照を返します。
引数の型が
void*ではありません (C では表面的な違いです)。
返される参照は type からの 借用参照 で、type への参照を保持している間は有効です。
Py_DECREF()などで解放しないでください。Added in version 3.11.
-
int PyType_GetBaseByToken(PyTypeObject *type, void *tp_token, PyTypeObject **result)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
type の メソッド解決順序 の中で、
Py_tp_tokenトークンが tp_token と等しい最初の基底クラスを探します。見つかった場合は、*result にその型への新しい 強参照 を設定して
1を返します。見つからない場合は、*result に
NULLを設定して0を返します。エラー時は *result に
NULLを設定し、例外を設定して-1を返します。
result 引数は
NULLにできます。 その場合、*result は設定されません。 戻り値だけが必要な場合に使ってください。tp_token 引数は
NULLにできません。Added in version 3.14.
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)¶
- これは Unstable APIです。マイナーリリースで予告なく変更されることがあります。
指定された型へのバージョンタグの割り当てを試みます。
型がすでに有効なバージョンタグを持っていたか、新しいタグを割り当てられた場合は 1 を返します。 新しいタグを割り当てられなかった場合は 0 を返します。
Added in version 3.12.
-
int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)¶
type のインスタンスが弱参照の作成をサポートする場合は真、それ以外の場合は偽を返します。 この関数は常に成功します。 type は
NULLであってはいけません。
ヒープに割り当てられる型の作成¶
次の関数で ヒープ型 を作成します。
-
PyObject *PyType_FromSlots(const PySlot *slots)¶
- 次に属します: Stable ABI (バージョン 3.15 より).
PySlot配列から ヒープ型 を作成して返します。 スロット全般については 定義用スロット、型の作成に固有のスロットについては 型のスロット ID を参照してください。この関数は新しい型に対して
PyType_Ready()を呼び出します。この関数の動作は、
type()の呼び出しやclass文の使用と完全には一致 しない 点に注意してください。 利用者が指定した基底型やメタクラスを使う場合は、PyType_From*関数よりもtype(またはメタクラス) を 呼び出す 方法を推奨します。 具体的には、次の違いがあります。__new__()is not called on the new class (and it must be set totype.__new__).新しいクラスの
__init__()は呼び出されません。どの基底クラスの
__init_subclass__()も呼び出されません。新しいデスクリプタの
__set_name__()は呼び出されません。
スロットは通常、グローバルな static const 配列として定義します。 ただし、スロットの値をコンパイル時に静的に決められない場合もあります。 例えば
Py_tp_bases、Py_tp_metaclass、Py_tp_moduleなどのスロットには、生存する Python オブジェクトが必要です。 この場合は、そうしたスロットをスタック上に置き、Py_slot_subslotsで静的なスロット配列を参照することを推奨します。 例えば次のようにします。static const PySlot my_slots[] = { PySlot_STATIC_DATA(Py_tp_name, "MyClass"), PySlot_FUNC(Py_tp_repr, my_repr_func), ... PySlot_END }; PyObject *make_my_class(PyObject *module) { PySlot all_slots[] = { PySlot_STATIC_DATA(Py_slot_subslots, my_slots), PySlot_DATA(Py_tp_module, module), PySlot_END }; return PyType_FromSlots(all_slots); }
Py_TPFLAGS_IMMUTABLETYPE フラグを付けずに作成したヒープ型は、Python コードで定義したクラスと同様に、属性の設定などによって変更できます。
型を完全に初期化するために、そうした変更が必要な場合もありますが、初期化が終わった後は利用者による変更を禁止したいかもしれません。
-
int PyType_Freeze(PyTypeObject *type)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
Py_TPFLAGS_IMMUTABLETYPEフラグを設定して、型を変更不能にします。type のすべての基底クラスが変更不能でなければなりません。
成功すると
0を返します。 エラー時は例外を設定して-1を返します。変更不能にする前に型を使ってはいけません。 例えば、変更不能にする前にその型のインスタンスを作成してはいけません。
Added in version 3.14.
型のスロット ID¶
型のスロット ID の大半は、PyTypeObject、PyNumberMethods、PySequenceMethods、PyMappingMethods、PyAsyncMethods 構造体のフィールド名に Py_ 接頭辞を付けた名前です。
例えば、次のように使います。
次のものをスロットとして指定するときには、追加の注意事項があります。
次の追加スロットは、PyTypeObject 構造体のフィールドに直接対応するものではありません。
次の「オフセット」フィールドは PyType_Slot では設定できません。
tp_weaklistoffset(可能なら代わりにPy_TPFLAGS_MANAGED_WEAKREFを使ってください)tp_dictoffset(可能なら代わりにPy_TPFLAGS_MANAGED_DICTを使ってください)tp_vectorcall_offset(PyMemberDef で"__vectorcalloffset__"を使ってください)
MANAGED フラグに切り替えられない場合 (例えば vectorcall を使う場合や Python 3.12 より前をサポートする場合) は、Py_tp_members でオフセットを指定してください。
詳細は PyMemberDef のドキュメント を参照してください。
次の内部フィールドは、ヒープ型の作成時には一切設定できません。
tp_dict,tp_mro,tp_cache,tp_subclasses, andtp_weaklist.
Py_tp_base スロットは Py_tp_bases と同等で、どちらにも型または型のタプルを設定できます。
両方を指定した場合は Py_tp_bases の値が使われます。
次のものを除き、スロットの値を NULL にはできません。
Py_tp_token(明確にするため、NULLよりPy_TP_USE_SPECを使うことを推奨します)
バージョン 3.9 で変更: PyBufferProcs のスロットは、制限のない API では設定できます。
バージョン 3.11 で変更: bf_getbuffer と bf_releasebuffer が Limited API でも利用できるようになりました。
バージョン 3.14 で変更: Py_tp_vectorcall で tp_vectorcall フィールドを設定できるようになりました。
詳細はフィールドの説明を参照してください。
バージョン 3.15 で変更: Py_tp_bases スロットに単一の型オブジェクトを設定して、Py_tp_base スロットと同じように使えるようになりました。
以前は型のタプルが必要でした。
次のスロットは基になる型の構造体のフィールドに対応しますが、スロットとして使う際には追加の注意事項があります。
-
Py_tp_name¶
- 次に属します: Stable ABI (バージョン 3.15 より).
型の名前を指定する
スロット IDで、PyTypeObject.tp_nameの設定に使います。型を作成するには、このスロット (または
PyType_Spec.name) が必要です。PyType_Spec.slotsでは使えません。 代わりにPyType_Spec.nameを使ってください。CPython はスロットを順番に処理します。 後のスロットの処理に失敗したときにエラーメッセージに名前を含められるように、
Py_tp_nameをスロット配列の先頭に置くことを推奨します。Added in version 3.15.
-
Py_tp_basicsize¶
- 次に属します: Stable ABI (バージョン 3.15 より).
インスタンスのサイズをバイト単位で指定する
スロット IDです。PyTypeObject.tp_basicsizeの設定に使います。値は正でなければなりません。
PyType_Spec.slotsでは使えません。 代わりにPyType_Spec.basicsizeを使ってください。このスロットは
PyType_GetSlot()では使えません。 必要であれば代わりにPyTypeObject.tp_basicsizeを使ってください。 ただし、型のサイズは実装詳細とみなされることが多い点に注意してください。Added in version 3.15.
-
Py_tp_extra_basicsize¶
- 次に属します: Stable ABI (バージョン 3.15 より).
型のデータサイズをバイト単位で指定する
スロット IDです。 基底クラスに必要な領域に 加えて、このクラスのインスタンスに必要な領域の大きさを指定します。この値は、基底クラスのサイズと合わせて
PyTypeObject.tp_basicsizeの設定に使われます。 Python はtp_basicsizeのアラインメント要件を満たすように、必要に応じてパディングを挿入します。この方法で確保したサブクラス固有のメモリへのポインタは、
PyObject_GetTypeData()で取得してください。値は正でなければなりません。 インスタンスに追加のサイズが不要である (サイズを継承する) 場合は、
Py_tp_extra_basicsizeスロットをゼロに設定するのではなく、省略してください。Py_tp_basicsizeとPy_tp_extra_basicsizeの両方を指定するとエラーになります。PyType_Spec.slotsでは使えません。 代わりに負のPyType_Spec.basicsizeを使ってください。このスロットは
PyType_GetSlot()では使えません。Added in version 3.15.
-
Py_tp_itemsize¶
- 次に属します: Stable ABI (バージョン 3.15 より).
可変サイズの型の 1 要素のサイズをバイト単位で指定する
スロット IDです。PyTypeObject.tp_itemsizeの設定に使います。 注意事項はtp_itemsizeの説明を参照してください。値は正でなければなりません。
このスロットがない場合は
tp_itemsizeを継承します。 任意の可変サイズのクラスを拡張するのは危険です。 可変サイズのメモリに固定のオフセットを使う型があり、サブクラスの固定サイズのメモリと重なる可能性があるためです。 誤りを防ぐため、itemsizeを継承できるのは次の場合だけです。基底クラスが可変サイズではない (
tp_itemsizeがゼロである) 場合。要求された
PyType_Spec.basicsizeが正で、基底クラスのメモリレイアウトを把握していると考えられる場合。要求された
PyType_Spec.basicsizeがゼロで、サブクラスがインスタンスのメモリに直接アクセスしないと考えられる場合。Py_TPFLAGS_ITEMS_AT_ENDフラグがある場合。
PyType_Spec.slotsでは使えません。 代わりにPyType_Spec.itemsizeを使ってください。このスロットは
PyType_GetSlot()では使えません。Added in version 3.15.
-
Py_tp_flags¶
- 次に属します: Stable ABI (バージョン 3.15 より).
型のフラグを指定する
スロット IDで、PyTypeObject.tp_flagsの設定に使います。Py_TPFLAGS_HEAPTYPEフラグは設定しません。PyType_FromSpecWithBases()が自動的に設定します。PyType_Spec.slotsでは使えません。 代わりに負のPyType_Spec.basicsizeを使ってください。このスロットは
PyType_GetSlot()では使えません。 代わりにPyType_GetFlags()を使ってください。Added in version 3.15.
-
Py_tp_bases¶
- 次に属します: Stable ABI.
Slot IDfor type flags, used to setPyTypeObject.tp_bases.新しい型が継承する型オブジェクトのタプルを設定できます。 Python の クラス定義 の「位置引数」に相当します。
また、単一の型オブジェクトを設定して基底クラスを 1 つ指定することもできます。 要素が 1 つのタプルを指定した場合と同じ効果があります。
バージョン 3.15 で変更: 以前の
Py_tp_basesには型のタプルが必要でした。
-
Py_tp_base¶
- 次に属します: Stable ABI.
Py_tp_bases(末尾にsがある方) と同等です。 両方を指定した場合はPy_tp_basesが優先され、このスロットは無視されます。バージョン 3.15 で変更: 以前の
Py_tp_baseにはタプルではなく単一の型が必要でした。バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 古い Python バージョンを対象としない場合は、
Py_tp_basesを使うことを推奨します。
次のスロットは、基になる構造体の公開フィールドには対応しません。
-
Py_tp_metaclass¶
- 次に属します: Stable ABI (バージョン 3.15 より).
作成される型オブジェクトの構築に使うメタクラスを指定する
スロット IDです。 省略すると、基底クラス (Py_tp_basesまたはPyType_FromMetaclass()の bases 引数) からメタクラスが決まります。tp_newをオーバーライドするメタクラスは、tp_newがNULLの場合を除いてサポートされません。PyType_Spec.slotsでは使えません。PyType_Specでメタクラスを指定するにはPyType_FromMetaclass()を使ってください。このスロットは
PyType_GetSlot()では使えません。 代わりに型オブジェクトに対してPy_TYPE()を使ってください。Added in version 3.15.
-
Py_tp_module¶
- 次に属します: Stable ABI (バージョン 3.15 より).
新しいクラスの定義元モジュールを記録する
スロット IDです。値はモジュールオブジェクトでなければなりません。 モジュールは新しい型に関連付けられ、後で
PyType_GetModule()を使って取得できます。 関連付けられたモジュールはサブクラスに継承されないため、クラスごとに指定する必要があります。PyType_Spec.slotsでは使えません。PyType_Specでモジュールを指定するにはPyType_FromMetaclass()を使ってください。このスロットは
PyType_GetSlot()では使えません。 代わりにPyType_GetModule()を使ってください。Added in version 3.15.
-
Py_tp_token¶
- 次に属します: Stable ABI (バージョン 3.14 より).
クラスの静的なメモリレイアウト ID を記録する
スロット IDです。クラスを
PyType_Specで定義し、その spec が静的に割り当てられている場合、特殊な値Py_TP_USE_SPECを使って spec をトークンとして設定できます。static PyType_Slot foo_slots[] = { {Py_tp_token, Py_TP_USE_SPEC},
任意のポインタを設定することもできますが、次の条件を満たす必要があります。
クラスが存在する間にポインタが他の用途に再利用されないよう、その参照先がクラスより長く存続すること。
他の拡張モジュールと競合しないよう、クラスが属する拡張モジュールにそのポインタが「属する」こと。
クラスの基底クラスが指定したトークンを持つかどうか、つまりメモリレイアウトに互換性があるかどうかを調べるには
PyType_GetBaseByToken()を使ってください。基底クラスを考慮せず、指定したクラスのトークンを取得するには、
Py_tp_tokenを指定してPyType_GetSlot()を使ってください。Added in version 3.14.
-
Py_TP_USE_SPEC¶
- 次に属します: Stable ABI (バージョン 3.14 より).
Py_tp_tokenの値として使い、クラスのPyType_Specをトークンに設定します。PyType_Specで定義されたクラスでのみ使えます。NULLに展開されます。Added in version 3.14.
-
Py_tp_slots¶
- 次に属します: Stable ABI (バージョン 3.15 より).
Py_slot_subslotsと同じように動作するスロット IDですが、PyType_Slot構造体の配列を指定します。Added in version 3.15.
緩やかに非推奨となった API¶
次の関数は 緩やかに非推奨 となっています。
引き続き動作しますが、新機能は新しい PyType_From* 関数の引数としてではなく、PyType_FromSlots() のスロットとして追加されます。
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- 次に属します: Stable ABI (バージョン 3.12 より).
spec から ヒープ型 を作成して返します (
Py_TPFLAGS_HEAPTYPEを参照)。NULLでない metaclass 引数はPy_tp_metaclassスロットに対応します。A non-
NULLbases argument corresponds to thePy_tp_basesslot, and takes precedence overPy_tp_basesandPy_tp_basesslots.NULLでない module 引数はPy_tp_moduleスロットに対応します。この関数は新しい型に対して
PyType_Ready()を呼び出します。この関数の動作は、
type()の呼び出しやclass文の使用と完全には一致 しない 点に注意してください。 詳細はPyType_FromSlots()の説明の注記を参照してください。Added in version 3.12.
バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
PyType_FromSlots()を使うことを推奨します。
-
PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.10 より).
PyType_FromMetaclass(NULL, module, spec, bases)と同等です。Added in version 3.9.
バージョン 3.10 で変更: bases 引数に単一のクラスを、
tp_docスロットにNULLを指定できるようになりました。バージョン 3.12 で変更: 指定された基底クラスに対応するメタクラスを探して使うようになりました。 以前は
typeのインスタンスだけを返していました。メタクラスの
tp_newは 無視 されるため、初期化が不完全になる可能性があります。 メタクラスがtp_newをオーバーライドしているクラスの作成は非推奨です。バージョン 3.14 で変更: メタクラスが
tp_newをオーバーライドしているクラスは、作成できなくなりました。バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
PyType_FromSlots()を使うことを推奨します。
-
PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.3 より).
PyType_FromMetaclass(NULL, NULL, spec, bases)と同等です。Added in version 3.3.
バージョン 3.12 で変更: 指定された基底クラスに対応するメタクラスを探して使うようになりました。 以前は
typeのインスタンスだけを返していました。メタクラスの
tp_newは 無視 されるため、初期化が不完全になる可能性があります。 メタクラスがtp_newをオーバーライドしているクラスの作成は非推奨です。バージョン 3.14 で変更: メタクラスが
tp_newをオーバーライドしているクラスは、作成できなくなりました。バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
PyType_FromSlots()を使うことを推奨します。
-
PyObject *PyType_FromSpec(PyType_Spec *spec)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
PyType_FromMetaclass(NULL, NULL, spec, NULL)と同等です。バージョン 3.12 で変更: Py_tp_base[s] スロットに指定された基底クラスに対応するメタクラスを探して使うようになりました。 以前は
typeのインスタンスだけを返していました。メタクラスの
tp_newは 無視 されるため、初期化が不完全になる可能性があります。 メタクラスがtp_newをオーバーライドしているクラスの作成は非推奨です。バージョン 3.14 で変更: メタクラスが
tp_newをオーバーライドしているクラスは、作成できなくなりました。バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
PyType_FromSlots()を使うことを推奨します。
-
type PyType_Spec¶
- 次に属します: Stable ABI (すべてのメンバーを含む).
型の動作を定義する構造体で、
PyType_FromMetaclass()などの緩やかに非推奨となった関数で使います。この構造体には、
PyType_FromSlots()の スロット としても指定できるメンバーがいくつかあり、それらに加えて、より単純な構造体のスロットエントリーの配列を含みます。-
const char *name¶
Py_tp_nameに対応します。
-
int basicsize¶
正の場合、
Py_tp_basicsizeに対応します。負の場合、絶対値を設定した
Py_tp_extra_basicsizeに対応します。バージョン 3.12 で変更: 以前はこのフィールドを負にできませんでした。
-
int itemsize¶
Py_tp_itemsizeに対応します。
-
unsigned int flags¶
Py_tp_flagsに対応します。
-
PyType_Slot *slots¶
PyType_Slot構造体の配列です (PySlotではありません)。特殊なスロット値
{0, NULL}で終端します。 各スロット ID は最大 1 回だけ指定する必要があります。-
type PyType_Slot¶
- 次に属します: Stable ABI (すべてのメンバーを含む).
型の任意の機能を定義する構造体で、
PyType_FromMetaclass()などの緩やかに非推奨となった関数で使います。Py_tp_slotsを使うとPyType_Slot配列をPySlot配列に含められ、逆方向にはPy_slot_subslotsを使えます。各
PyType_Slot構造体tpslotは、次のPySlot構造体として解釈されます。(PySlot){ .sl_id=tpslot.slot, .sl_flags=PySlot_INTPTR | sub_static, .sl_ptr=tpslot.func }
ここで
sub_staticは、スロットがそのフラグを必要とする場合 (例えばPy_tp_methods) または「親」のPy_tp_slotsスロット (存在する場合) にこのフラグがある場合に、PySlot_STATICになります。-
int slot¶
PySlot.sl_idに対応します。
-
void *pfunc¶
PySlot.sl_ptrに対応します。
-
int slot¶
-
type PyType_Slot¶
-
const char *name¶