pythonのソースコードを調べる
この構造体のメンバーには接頭子tp_が付けられている。
typeobjectの頭文字と予想される。
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */ #この構造体の名前を要求されたときのフォーマット?
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ #メモリの上限値?
/* Methods to implement standard operations */
destructor tp_dealloc; #デストラクタ?
printfunc tp_print; #プリントファンクション?
getattrfunc tp_getattr; #この構造体のゲッター?
setattrfunc tp_setattr; #この構造体のセッタ?
PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
or tp_reserved (Python 3) */ #?
reprfunc tp_repr; #?
/* Method suites for standard classes */
PyNumberMethods *tp_as_number; #PyObjectが数値だった場合のメソッド(nb_add,nb_subtract,nb_multiply,nb_divmodなどへの関数へのポインタが並んで知る接頭子のnbは?
PySequenceMethods *tp_as_sequence; #PyObjectがシーケンスタイプのオブジエクトだった場合の構造体。接頭子のsqはシーケンス(sequence)由来と思われる。おそらくリスト、タプルに適用されるのだろう
PyMappingMethods *tp_as_mapping; #PyObjectがマッピングタイプのオブジエクトだった場合の構造体 辞書に適用されるのだろう。
/* More standard operations (here for binary compatibility) */
hashfunc tp_hash; #?
ternaryfunc tp_call; #?
reprfunc tp_str; #?
getattrofunc tp_getattro; #?
setattrofunc tp_setattro; #?
/* Functions to access object as input/output buffer */
PyBufferProcs *tp_as_buffer; #何かのバッフア?
/* Flags to define presence of optional/expanded features */
unsigned long tp_flags; #オプション機能/拡張機能の有無を定義するフラグ?
const char *tp_doc; /* Documentation string */ #ドキュメント文字列へのポインタ?
/* Assigned meaning in release 2.0 */
/* call function for all accessible objects */
traverseproc tp_traverse; #?
/* delete references to contained objects */
inquiry tp_clear; #?
/* Assigned meaning in release 2.1 */
/* rich comparisons */
richcmpfunc tp_richcompare; #?
/* weak reference enabler */
Py_ssize_t tp_weaklistoffset; #弱い参照?
/* Iterators */
getiterfunc tp_iter;
iternextfunc tp_iternext;
/* Attribute descriptor and subclassing stuff */
struct PyMethodDef *tp_methods; #Pythonビルトイン関数/メソッドへのポインタ
struct PyMemberDef *tp_members; #?
struct PyGetSetDef *tp_getset; #?
struct _typeobject *tp_base; #?
PyObject *tp_dict; #?
descrgetfunc tp_descr_get; #?
descrsetfunc tp_descr_set; #?
Py_ssize_t tp_dictoffset; #?
initproc tp_init; #?
allocfunc tp_alloc; #?
newfunc tp_new; #?
freefunc tp_free; /* Low-level free-memory routine */ #?
inquiry tp_is_gc; /* For PyObject_IS_GC */ #ガ-ベージコレクション?
PyObject *tp_bases; #?
PyObject *tp_mro; /* method resolution order */ #?
PyObject *tp_cache; #?
PyObject *tp_subclasses; #?
PyObject *tp_weaklist; #?
destructor tp_del; #?
/* Type attribute cache version tag. Added in version 2.6 */
unsigned int tp_version_tag; #?
destructor tp_finalize; #?
#ifdef COUNT_ALLOCS #なし
/* these must be last and never explicitly initialized */
Py_ssize_t tp_allocs;
Py_ssize_t tp_frees;
Py_ssize_t tp_maxalloc;
struct _typeobject *tp_prev;
struct _typeobject *tp_next;
#endif
} PyTypeObject;
構造体の先頭にあるPyObject_VAR_HEADはPyVarObjectを表すマクロ
PyVarObjectはPyObjectにPy_ssize_t ob_sizeを追加して拡張したもののようである。