型オブジェクトは標準の型(standardtype)に比べるとかなり大きな構造体です。各型オブジェクトは多くの値を保持しており、そのほとんどはC関数へのポインタで、それぞれの関数はその型の機能の小さい部分を実装しています。この節では、型オブジェクトの各フィールドについて詳細を説明します。各フィールドは、構造体内で出現する順番に説明されています。
特殊メソッド/特殊属性
O
T
D
I
constchar*
__name__
X
__getattribute__,__getattr__
G
__setattr__,__delattr__
%
__repr__
__hash__
__call__
__str__
unsignedlong
__doc__
__lt__,__le__,__eq__,__ne__,__gt__,__ge__
__iter__
__next__
__base__
__dict__
__get__
__set__,__delete__
__init__
__new__
__bases__
~
__mro__
__subclasses__
unsignedint
__del__
():Aslotnameinparenthesesindicatesitis(effectively)deprecated.
<>:NamesinanglebracketsshouldbeinitiallysettoNULLandtreatedasread-only.
[]:Namesinsquarebracketsareforinternaluseonly.
列:
"O":setonPyBaseObject_Type
"D":default(ifslotissettoNULL)
X-PyType_ReadysetsthisvalueifitisNULL~-PyType_Readyalwayssetsthisvalue(itshouldbeNULL)-PyType_ReadymaysetthisvaluedependingonotherslotsAlsoseetheinheritancecolumn("I")."I":inheritance
Slot
特殊メソッド
__await__
__aiter__
__anext__
__add____radd__
__iadd__
__sub____rsub__
__isub__
__mul____rmul__
__imul__
__mod____rmod__
__imod__
__divmod____rdivmod__
__pow____rpow__
__ipow__
__neg__
__pos__
__abs__
__bool__
__invert__
__lshift____rlshift__
__ilshift__
__rshift____rrshift__
__irshift__
__and____rand__
__iand__
__xor____rxor__
__ixor__
__or____ror__
__ior__
__int__
void*
__float__
__floordiv__
__ifloordiv__
__truediv__
__itruediv__
__index__
__matmul____rmatmul__
__imatmul__
__len__
__getitem__
__setitem__,__delitem__
__add__
__mul__
__setitem____delitem__
__contains__
定義型(typedef)
引数型
返り値型
void
int
Py_hash_t
継承:
サブタイプはこのフィールドを継承しません。
型自体の型、別の言い方をするとメタタイプです。PyObject_HEAD_INITマクロで初期化され、通常は&PyType_Typeになります。しかし、(少なくとも)Windowsで利用できる動的ロード可能な拡張モジュールでは、コンパイラは有効な初期化ではないと文句をつけます。そこで、ならわしとして、PyObject_HEAD_INITにはNULLを渡して初期化しておき、他の操作を行う前にモジュールの初期化関数で明示的にこのフィールドを初期化することになっています。この操作は以下のように行います:
サブタイプはこのフィールドを継承します。
Thesefieldsarenotinheritedbysubtypes.
これらのフィールドは、型インスタンスのバイトサイズを計算できるようにします。
Foranytypewithvariable-lengthinstances,thisfieldmustnotbeNULL.
インスタンスのデストラクタ関数へのポインタです。この関数は(単量子NoneやEllipsisの場合のように)インスタンスが決してメモリ解放されない型でない限り必ず定義しなければなりません。シグネチャは次の通りです:
staticvoidfoo_dealloc(foo_object*self){PyTypeObject*tp=Py_TYPE(self);//freereferencesandbuffersheretp->tp_free(self);Py_DECREF(tp);}継承:
警告
バージョン3.8で変更:Beforeversion3.8,thisslotwasnamedtp_print.InPython2.x,itwasusedforprintingtoafile.InPython3.0to3.7,itwasunused.
オプションのポインタで、get-attribute-stringを行う関数を指します。
オプションのポインタで、属性の設定と削除を行う関数を指します。
バージョン3.5で追加:以前はtp_compareやtp_reservedとして知られていました。
デフォルト
このフィールドが設定されていない場合、<%sobjectat%p>の形式をとる文字列が返されます。%sは型の名前に、%pはオブジェクトのメモリアドレスに置き換えられます。
Py_hash_ttp_hash(PyObject*);通常時には-1を戻り値にしてはなりません;ハッシュ値の計算中にエラーが生じた場合、関数は例外をセットして-1を返さねばなりません。
PyObject*tp_call(PyObject*self,PyObject*args,PyObject*kwargs);継承:
オプションのポインタで、get-attributeを実装している関数を指します。
PyBaseObject_TypeusesPy_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE.
BitMasks:
型を別の型の基底タイプとして使える場合にセットされるビットです。このビットがクリアならば、この型のサブタイプは生成できません(Javaにおける"final"クラスに似たクラスになります)。
Thisisabitmaskofallthebitsthatpertaintotheexistenceofcertainfieldsinthetypeobjectanditsextensionstructures.Currently,itincludesthefollowingbits:Py_TPFLAGS_HAVE_STACKLESS_EXTENSION.
Thisbitindicatesthatobjectsbehavelikeunboundmethods.
Ifthisflagissetfortype(meth),then:
Thisflagenablesanoptimizationfortypicalmethodcallslikeobj.meth():itavoidscreatingatemporary"boundmethod"objectforobj.meth.
バージョン3.8で追加.
バージョン3.4で追加.
バージョン3.9で追加.
Thisbitissetfortypeobjectsthatareimmutable:typeattributescannotbesetnordeleted.
Thisflagisnotinherited.
バージョン3.10で追加.
注釈
参考
AnoptionalpointertoaNUL-terminatedCstringgivingthedocstringforthistypeobject.Thisisexposedasthe__doc__attributeonthetypeandinstancesofthetype.
オプションのポインタで、拡張比較関数を指します。シグネチャは次の通りです:
この関数は、比較結果を返すべきです。(普通はPy_TrueかPy_Falseです。)比較が未定義の場合は、Py_NotImplementedを、それ以外のエラーが発生した場合には例外状態をセットしてNULLを返さなければなりません。
定数
比較
<
<=
==
!=
>
>=
拡張比較関数(richcomparisonfunctions)を簡単に記述するためのマクロが定義されています:
エラー時には例外を設定して、関数からNULLでリターンします。
バージョン3.7で追加.
PyObject*tp_iter(PyObject*self);継承:
サブタイプはこのフィールドを継承しません(メソッドは別個のメカニズムで継承されています)。
サブタイプはこのフィールドを継承しません(メンバは別個のメカニズムで継承されています)。
サブタイプはこのフィールドを継承しません(算出属性は別個のメカニズムで継承されています)。
オプションのポインタで、型に関するプロパティを継承する基底タイプを指します。このフィールドのレベルでは、単継承(singleinheritance)だけがサポートされています;多重継承はメタタイプの呼び出しによる動的な型オブジェクトの生成を必要とします。
However,theunary'&'operatorappliedtoanon-staticvariablelikePyBaseObject_Typeisnotrequiredtoproduceanaddressconstant.Compilersmaysupportthis(gccdoes),MSVCdoesnot.Bothcompilersarestrictlystandardconforminginthisparticularbehavior.
(当たり前ですが)サブタイプはこのフィールドを継承しません。
サブタイプはこのフィールドを継承しません(が、この辞書内で定義されている属性は異なるメカニズムで継承されます)。
オプションのポインタで、デスクリプタのget関数を指します。
関数のシグネチャは次のとおりです
PyObject*tp_descr_get(PyObject*self,PyObject*obj,PyObject*type);継承:
オプションのポインタで、デスクリプタの値の設定と削除を行う関数を指します。
inttp_descr_set(PyObject*self,PyObject*obj,PyObject*value);値を削除するには、value引数にNULLを設定します。
オプションのポインタで、インスタンス初期化関数を指します。
成功のときには0を、エラー時には例外をセットして-1を返します。
オプションのポインタで、インスタンスのメモリ確保関数を指します。
PyObject*tp_alloc(PyTypeObject*self,Py_ssize_tnitems);継承:
Thisfieldisinheritedbystaticsubtypes,butnotbydynamicsubtypes(subtypescreatedbyaclassstatement).
オプションのポインタで、インスタンス生成関数を指します。
オプションのポインタで、インスタンスのメモリ解放関数を指します。シグネチャは以下の通りです:
Thisfieldisinheritedbystaticsubtypes,butnotbydynamicsubtypes(subtypescreatedbyaclassstatement)
オプションのポインタで、ガベージコレクタから呼び出される関数を指します。
基底型からなるタプルです。
Multipleinheritancedoesnotworkwellforstaticallydefinedtypes.Ifyousettp_basestoatuple,Pythonwillnotraiseanerror,butsomeslotswillonlybeinheritedfromthefirstbase.
このフィールドは継承されません。
未使用のフィールドです。内部でのみ利用されます。
Listofweakreferencestosubclasses.Internaluseonly.
この型オブジェクトに対する弱参照からなるリストの先頭です。
メソッドキャッシュへのインデックスとして使われます。内部使用だけのための関数です。
オプションのポインタで、インスタンスの終了処理関数を指します。シグネチャは以下の通りです:
このフィールドは決して継承されません。
バージョン3.9で追加:(このフィールドは3.8から存在していますが、3.9以降でしか利用できません)
ThisresultsintypesthatarelimitedrelativetotypesdefinedinPython:
以下は構造体の定義です:
typedefstruct{binaryfuncnb_add;binaryfuncnb_subtract;binaryfuncnb_multiply;binaryfuncnb_remainder;binaryfuncnb_divmod;ternaryfuncnb_power;unaryfuncnb_negative;unaryfuncnb_positive;unaryfuncnb_absolute;inquirynb_bool;unaryfuncnb_invert;binaryfuncnb_lshift;binaryfuncnb_rshift;binaryfuncnb_and;binaryfuncnb_xor;binaryfuncnb_or;unaryfuncnb_int;void*nb_reserved;unaryfuncnb_float;binaryfuncnb_inplace_add;binaryfuncnb_inplace_subtract;binaryfuncnb_inplace_multiply;binaryfuncnb_inplace_remainder;ternaryfuncnb_inplace_power;binaryfuncnb_inplace_lshift;binaryfuncnb_inplace_rshift;binaryfuncnb_inplace_and;binaryfuncnb_inplace_xor;binaryfuncnb_inplace_or;binaryfuncnb_floor_divide;binaryfuncnb_true_divide;binaryfuncnb_inplace_floor_divide;binaryfuncnb_inplace_true_divide;unaryfuncnb_index;binaryfuncnb_matrix_multiply;binaryfuncnb_inplace_matrix_multiply;}PyNumberMethods;注釈
二項関数と三項関数は、すべてのオペランドの型をチェックしなければならず、必要な変換を実装しなければなりません(すくなくともオペランドの一つは定義している型のインスタンスです).もし与えられたオペランドに対して操作が定義されなければ、二項関数と三項関数はPy_NotImplementedを返さなければならず、他のエラーが起こった場合は、NULLを返して例外を設定しなければなりません。
この構造体はマップ型プロトコルを実装するために使われる関数群へのポインタを保持しています。以下の3つのメンバを持っています:
この構造体はシーケンス型プロトコルを実装するために使われる関数群へのポインタを保持しています。
この関数のシグネチャは以下の通りです:
int(PyObject*exporter,Py_buffer*view,intflags);flagsで指定された方法でviewを埋めてほしいというexporterに対する要求を処理します。ステップ(3)を除いて、この関数の実装では以下のステップを行わなければなりません:
exporterがバッファプロバイダのチェインかツリーの一部であれば、2つの主要な方式が使用できます:
バージョン3.5で追加.
オブジェクトが非同期反復処理のプロトコルを実装していない場合、このスロットをNULLに設定します。
オブジェクトの属性の値を返します。
オブジェクトの属性に値を設定します。属性を削除するには、value(実)引数にNULLを設定します。
typedefstruct{PyObject_HEADconstchar*data;}MyObject;staticPyTypeObjectMyObject_Type={PyVarObject_HEAD_INIT(NULL,0).tp_name="mymod.MyObject",.tp_basicsize=sizeof(MyObject),.tp_doc=PyDoc_STR("Myobjects"),.tp_new=myobj_new,.tp_dealloc=(destructor)myobj_dealloc,.tp_repr=(reprfunc)myobj_repr,};より冗長な初期化子を用いた古いコードを(特にCPythonのコードベース中で)見かけることがあるかもしれません:
staticPyTypeObjectMyObject_Type={PyVarObject_HEAD_INIT(NULL,0)"mymod.MyObject",/*tp_name*/sizeof(MyObject),/*tp_basicsize*/0,/*tp_itemsize*/(destructor)myobj_dealloc,/*tp_dealloc*/0,/*tp_vectorcall_offset*/0,/*tp_getattr*/0,/*tp_setattr*/0,/*tp_as_async*/(reprfunc)myobj_repr,/*tp_repr*/0,/*tp_as_number*/0,/*tp_as_sequence*/0,/*tp_as_mapping*/0,/*tp_hash*/0,/*tp_call*/0,/*tp_str*/0,/*tp_getattro*/0,/*tp_setattro*/0,/*tp_as_buffer*/0,/*tp_flags*/PyDoc_STR("Myobjects"),/*tp_doc*/0,/*tp_traverse*/0,/*tp_clear*/0,/*tp_richcompare*/0,/*tp_weaklistoffset*/0,/*tp_iter*/0,/*tp_iternext*/0,/*tp_methods*/0,/*tp_members*/0,/*tp_getset*/0,/*tp_base*/0,/*tp_dict*/0,/*tp_descr_get*/0,/*tp_descr_set*/0,/*tp_dictoffset*/0,/*tp_init*/0,/*tp_alloc*/myobj_new,/*tp_new*/};