Документация Python неофициальный перевод

typeobj.md

2284 строк · 207.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.13/c-api/typeobj.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Структуры объектов типа89Пожалуй, одна из самых важных структур объектной системы Python – это структура, определяющая новый тип: структура [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject). Объекты типа можно обрабатывать с помощью любой из функций `PyObject_*` или `PyType_*`, но для большинства приложений Python они не представляют большого интереса. Эти объекты являются основой поведения объектов, поэтому они очень важны как для самого интерпретатора, так и для любых модулей расширения, реализующих новые типы.1011Объекты типа довольно велики по сравнению с большинством стандартных типов. Причина такого размера в том, что каждый объект типа хранит большое количество значений, в основном указателей на функции C, каждый из которых реализует небольшую часть функциональности типа. Поля объекта типа подробно рассматриваются в этом разделе. Поля будут описаны в порядке их появления в структуре.1213В дополнение к следующему краткому справочнику раздел [Примеры](https://python-all.ru/3.13/c-api/typeobj.html#typedef-examples) даёт представление о значении и использовании [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject).1415## Краткий справочник1617### “tp slots”1819| PyTypeObject Slot [\[1\]](https://python-all.ru/3.13/c-api/typeobj.html#slots) | [Тип](https://python-all.ru/3.13/c-api/typeobj.html#slot-typedefs-table) | специальные методы/атрибуты | Информация [\[2\]](https://python-all.ru/3.13/c-api/typeobj.html#cols) |  |  |  |20| --- | --- | --- | --- | --- | --- | --- |21| O | T | D | I |  |  |  |22| \<R\> [`tp_name`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_name) | const char \* | name | X | X |  |  |23| [`tp_basicsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_basicsize) | [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) |  | X | X |  | X |24| [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) | [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) |  |  | X |  | X |25| [`tp_dealloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dealloc) | [`destructor`](https://python-all.ru/3.13/c-api/typeobj.html#c.destructor) |  | X | X |  | X |26| [`tp_vectorcall_offset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) | [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) |  |  | X |  | X |27| ([`tp_getattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattr)) | [`getattrfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getattrfunc) | getattribute\_\_, \_\_getattr |  |  |  | G |28| ([`tp_setattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattr)) | [`setattrfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.setattrfunc) | setattr\_\_, \_\_delattr |  |  |  | G |29| [`tp_as_async`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_async) | [`PyAsyncMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods) \* | [подслоты](https://python-all.ru/3.13/c-api/typeobj.html#sub-slots) |  |  |  | % |30| [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr) | [`reprfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.reprfunc) | repr | X | X |  | X |31| [`tp_as_number`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_number) | [`PyNumberMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods) \* | [подслоты](https://python-all.ru/3.13/c-api/typeobj.html#sub-slots) |  |  |  | % |32| [`tp_as_sequence`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_sequence) | [`PySequenceMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods) \* | [подслоты](https://python-all.ru/3.13/c-api/typeobj.html#sub-slots) |  |  |  | % |33| [`tp_as_mapping`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_mapping) | [`PyMappingMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods) \* | [подслоты](https://python-all.ru/3.13/c-api/typeobj.html#sub-slots) |  |  |  | % |34| [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash) | [`hashfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.hashfunc) | hash | X |  |  | G |35| [`tp_call`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_call) | [`ternaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ternaryfunc) | call |  | X |  | X |36| [`tp_str`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_str) | [`reprfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.reprfunc) | str | X |  |  | X |37| [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro) | [`getattrofunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getattrofunc) | getattribute\_\_, \_\_getattr | X | X |  | G |38| [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro) | [`setattrofunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.setattrofunc) | setattr\_\_, \_\_delattr | X | X |  | G |39| [`tp_as_buffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer) | [`PyBufferProcs`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs) \* | [подслоты](https://python-all.ru/3.13/c-api/typeobj.html#sub-slots) |  |  |  | % |40| [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags) | unsigned long |  | X | X |  | ? |41| [`tp_doc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_doc) | const char \* | doc | X | X |  |  |42| [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) | [`traverseproc`](https://python-all.ru/3.13/c-api/gcsupport.html#c.traverseproc) |  |  | X |  | G |43| [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) | [`inquiry`](https://python-all.ru/3.13/c-api/gcsupport.html#c.inquiry) |  |  | X |  | G |44| [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) | [`richcmpfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.richcmpfunc) | lt\_\_, \_\_le\_\_, \_\_eq\_\_, \_\_ne\_\_, \_\_gt\_\_, \_\_ge | X |  |  | G |45| ([`tp_weaklistoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset)) | [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) |  |  | X |  | ? |46| [`tp_iter`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_iter) | [`getiterfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getiterfunc) | iter |  |  |  | X |47| [`tp_iternext`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_iternext) | [`iternextfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.iternextfunc) | next |  |  |  | X |48| [`tp_methods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_methods) | [`PyMethodDef`](https://python-all.ru/3.13/c-api/structures.html#c.PyMethodDef) \[\] |  | X | X |  |  |49| [`tp_members`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_members) | [`PyMemberDef`](https://python-all.ru/3.13/c-api/structures.html#c.PyMemberDef) \[\] |  |  | X |  |  |50| [`tp_getset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getset) | [`PyGetSetDef`](https://python-all.ru/3.13/c-api/structures.html#c.PyGetSetDef) \[\] |  | X | X |  |  |51| [`tp_base`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_base) | [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) \* | base |  |  | X |  |52| [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | dict |  |  | ? |  |53| [`tp_descr_get`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_descr_get) | [`descrgetfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.descrgetfunc) | get |  |  |  | X |54| [`tp_descr_set`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_descr_set) | [`descrsetfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.descrsetfunc) | set\_\_, \_\_delete |  |  |  | X |55| ([`tp_dictoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset)) | [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) |  |  | X |  | ? |56| [`tp_init`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_init) | [`initproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.initproc) | init | X | X |  | X |57| [`tp_alloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_alloc) | [`allocfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.allocfunc) |  | X |  | ? | ? |58| [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) | [`newfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.newfunc) | new | X | X | ? | ? |59| [`tp_free`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_free) | [`freefunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.freefunc) |  | X | X | ? | ? |60| [`tp_is_gc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_is_gc) | [`inquiry`](https://python-all.ru/3.13/c-api/gcsupport.html#c.inquiry) |  |  | X |  | X |61| \<[`tp_bases`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_bases)\> | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | bases |  |  | ~ |  |62| \<[`tp_mro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_mro)\> | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | mro |  |  | ~ |  |63| \[[`tp_cache`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_cache)\] | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |  |  |  |  |  |64| \[[`tp_subclasses`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_subclasses)\] | void \* | subclasses |  |  |  |  |65| \[[`tp_weaklist`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklist)\] | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |  |  |  |  |  |66| ([`tp_del`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_del)) | [`destructor`](https://python-all.ru/3.13/c-api/typeobj.html#c.destructor) |  |  |  |  |  |67| \[[`tp_version_tag`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_version_tag)\] | unsigned int |  |  |  |  |  |68| [`tp_finalize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_finalize) | [`destructor`](https://python-all.ru/3.13/c-api/typeobj.html#c.destructor) | del |  |  |  | X |69| [`tp_vectorcall`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall) | [`vectorcallfunc`](https://python-all.ru/3.13/c-api/call.html#c.vectorcallfunc) |  |  |  |  |  |70| \[[`tp_watched`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_watched)\] | unsigned char |  |  |  |  |  |7172\[[1](https://python-all.ru/3.13/c-api/typeobj.html#id1)\]7374**()**: Имя слота в круглых скобках указывает, что оно (фактически) устарело.7576**\<\>**: Имена в угловых скобках должны быть изначально установлены в `NULL` и считаться только для чтения.7778**\[\]**: Имена в квадратных скобках предназначены только для внутреннего использования.7980**\<R\>** (в качестве префикса) означает, что поле обязательно (должно быть не-`NULL`).8182\[[2](https://python-all.ru/3.13/c-api/typeobj.html#id2)\]8384Столбцы:8586**“O”**: устанавливается на [`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type)8788**“T”**: устанавливается на [`PyType_Type`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Type)8990**“D”**: значение по умолчанию (если слот установлен в `NULL`)9192```text93X - PyType_Ready sets this value if it is NULL94~ - PyType_Ready always sets this value (it should be NULL)95? - PyType_Ready may set this value depending on other slots9697Also see the inheritance column ("I").98```99100**“I”**: наследование101102```text103X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value104% - the slots of the sub-struct are inherited individually105G - inherited, but only in combination with other slots; see the slot's description106? - it's complicated; see the slot's description107```108109Обратите внимание, что некоторые слоты фактически наследуются через обычную цепочку поиска атрибутов.110111### подслоты112113| Слот | [Тип](https://python-all.ru/3.13/c-api/typeobj.html#slot-typedefs-table) | специальные методы |114| --- | --- | --- |115| [`am_await`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods.am_await) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | await |116| [`am_aiter`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods.am_aiter) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | aiter |117| [`am_anext`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods.am_anext) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | anext |118| [`am_send`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods.am_send) | [`sendfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.sendfunc) |  |119|  |  |  |120| [`nb_add`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_add) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | add\_\_ \_\_radd |121| [`nb_inplace_add`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_add) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | iadd |122| [`nb_subtract`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_subtract) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | sub\_\_ \_\_rsub |123| [`nb_inplace_subtract`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_subtract) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | isub |124| [`nb_multiply`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_multiply) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | mul\_\_ \_\_rmul |125| [`nb_inplace_multiply`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_multiply) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | imul |126| [`nb_remainder`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_remainder) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | mod\_\_ \_\_rmod |127| [`nb_inplace_remainder`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_remainder) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | imod |128| [`nb_divmod`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_divmod) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | divmod\_\_ \_\_rdivmod |129| [`nb_power`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_power) | [`ternaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ternaryfunc) | pow\_\_ \_\_rpow |130| [`nb_inplace_power`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_power) | [`ternaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ternaryfunc) | ipow |131| [`nb_negative`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_negative) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | neg |132| [`nb_positive`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_positive) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | pos |133| [`nb_absolute`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_absolute) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | abs |134| [`nb_bool`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_bool) | [`inquiry`](https://python-all.ru/3.13/c-api/gcsupport.html#c.inquiry) | bool |135| [`nb_invert`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_invert) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | invert |136| [`nb_lshift`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_lshift) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | lshift\_\_ \_\_rlshift |137| [`nb_inplace_lshift`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_lshift) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | ilshift |138| [`nb_rshift`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_rshift) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | rshift\_\_ \_\_rrshift |139| [`nb_inplace_rshift`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_rshift) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | irshift |140| [`nb_and`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_and) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | and\_\_ \_\_rand |141| [`nb_inplace_and`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_and) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | iand |142| [`nb_xor`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_xor) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | xor\_\_ \_\_rxor |143| [`nb_inplace_xor`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_xor) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | ixor |144| [`nb_or`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_or) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | or\_\_ \_\_ror |145| [`nb_inplace_or`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_or) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | ior |146| [`nb_int`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_int) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | int |147| [`nb_reserved`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_reserved) | void \* |  |148| [`nb_float`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_float) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | float |149| [`nb_floor_divide`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_floor_divide) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | floordiv |150| [`nb_inplace_floor_divide`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_floor_divide) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | ifloordiv |151| [`nb_true_divide`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_true_divide) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | truediv |152| [`nb_inplace_true_divide`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_true_divide) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | itruediv |153| [`nb_index`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_index) | [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | index |154| [`nb_matrix_multiply`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_matrix_multiply) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | matmul\_\_ \_\_rmatmul |155| [`nb_inplace_matrix_multiply`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_matrix_multiply) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | imatmul |156|  |  |  |157| [`mp_length`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods.mp_length) | [`lenfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.lenfunc) | len |158| [`mp_subscript`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods.mp_subscript) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | getitem |159| [`mp_ass_subscript`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods.mp_ass_subscript) | [`objobjargproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.objobjargproc) | setitem\_\_, \_\_delitem |160|  |  |  |161| [`sq_length`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_length) | [`lenfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.lenfunc) | len |162| [`sq_concat`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_concat) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | add |163| [`sq_repeat`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_repeat) | [`ssizeargfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ssizeargfunc) | mul |164| [`sq_item`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_item) | [`ssizeargfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ssizeargfunc) | getitem |165| [`sq_ass_item`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_ass_item) | [`ssizeobjargproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ssizeobjargproc) | setitem\_\_ \_\_delitem |166| [`sq_contains`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_contains) | [`objobjproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.objobjproc) | contains |167| [`sq_inplace_concat`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_inplace_concat) | [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | iadd |168| [`sq_inplace_repeat`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_inplace_repeat) | [`ssizeargfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ssizeargfunc) | imul |169|  |  |  |170| [`bf_getbuffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer) | [`getbufferproc()`](https://python-all.ru/3.13/c-api/typeobj.html#c.getbufferproc) | buffer |171| [`bf_releasebuffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) | [`releasebufferproc()`](https://python-all.ru/3.13/c-api/typeobj.html#c.releasebufferproc) | release\_buffer |172173### slot typedefs174175| typedef | Типы параметров | Тип возвращаемого значения |176| --- | --- | --- |177| [`allocfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.allocfunc) | [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) \* [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |178| [`destructor`](https://python-all.ru/3.13/c-api/typeobj.html#c.destructor) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | void |179| [`freefunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.freefunc) | void \* | void |180| [`traverseproc`](https://python-all.ru/3.13/c-api/gcsupport.html#c.traverseproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`visitproc`](https://python-all.ru/3.13/c-api/gcsupport.html#c.visitproc) void \* | int |181| [`newfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.newfunc) | [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |182| [`initproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.initproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |183| [`reprfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.reprfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |184| [`getattrfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getattrfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* const char \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |185| [`setattrfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.setattrfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* const char \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |186| [`getattrofunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getattrofunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |187| [`setattrofunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.setattrofunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |188| [`descrgetfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.descrgetfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |189| [`descrsetfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.descrsetfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |190| [`hashfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.hashfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | Py\_hash\_t |191| [`richcmpfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.richcmpfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* int | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |192| [`getiterfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getiterfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |193| [`iternextfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.iternextfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |194| [`lenfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.lenfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) |195| [`getbufferproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.getbufferproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`Py_buffer`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer) \* int | int |196| [`releasebufferproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.releasebufferproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`Py_buffer`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer) \* | void |197| [`inquiry`](https://python-all.ru/3.13/c-api/gcsupport.html#c.inquiry) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |198| [`unaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.unaryfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |199| [`binaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.binaryfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |200| [`ternaryfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ternaryfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |201| [`ssizeargfunc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ssizeargfunc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* |202| [`ssizeobjargproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.ssizeobjargproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`Py_ssize_t`](https://python-all.ru/3.13/c-api/intro.html#c.Py_ssize_t) [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |203| [`objobjproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.objobjproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |204| [`objobjargproc`](https://python-all.ru/3.13/c-api/typeobj.html#c.objobjargproc) | [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) \* | int |205206Подробнее см. [определения типов слотов](https://python-all.ru/3.13/c-api/typeobj.html#id6) ниже.207208## Определение PyTypeObject209210Определение структуры для [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) можно найти в `Include/cpython/object.h`. Для удобства здесь повторяется определение, приведённое там:211212```c213typedef struct _typeobject {214    PyObject_VAR_HEAD215    const char *tp_name; /* Для вывода в формате "<module>.<name>" */216    Py_ssize_t tp_basicsize, tp_itemsize; /* Для выделения памяти */217218    /* Методы для реализации стандартных операций */219220    destructor tp_dealloc;221    Py_ssize_t tp_vectorcall_offset;222    getattrfunc tp_getattr;223    setattrfunc tp_setattr;224    PyAsyncMethods *tp_as_async; /* ранее известный как tp_compare (Python 2)225                                    или tp_reserved (Python 3) */226    reprfunc tp_repr;227228    /* Наборы методов для стандартных классов */229230    PyNumberMethods *tp_as_number;231    PySequenceMethods *tp_as_sequence;232    PyMappingMethods *tp_as_mapping;233234    /* Дополнительные стандартные операции (здесь для двоичной совместимости) */235236    hashfunc tp_hash;237    ternaryfunc tp_call;238    reprfunc tp_str;239    getattrofunc tp_getattro;240    setattrofunc tp_setattro;241242    /* Функции для доступа к объекту как к буферу ввода/вывода */243    PyBufferProcs *tp_as_buffer;244245    /* Флаги для определения наличия опциональных/расширенных возможностей */246    unsigned long tp_flags;247248    const char *tp_doc; /* Строка документации */249250    /* Назначенное значение в версии 2.0 */251    /* вызов функции для всех доступных объектов */252    traverseproc tp_traverse;253254    /* удаление ссылок на содержащиеся объекты */255    inquiry tp_clear;256257    /* Назначенное значение в версии 2.1 */258    /* расширенные сравнения */259    richcmpfunc tp_richcompare;260261    /* включение слабых ссылок */262    Py_ssize_t tp_weaklistoffset;263264    /* Итераторы */265    getiterfunc tp_iter;266    iternextfunc tp_iternext;267268    /* Дескриптор атрибутов и механизмы подклассов */269    struct PyMethodDef *tp_methods;270    struct PyMemberDef *tp_members;271    struct PyGetSetDef *tp_getset;272    // Сильная ссылка на тип в куче, заимствованная ссылка на статический тип273    struct _typeobject *tp_base;274    PyObject *tp_dict;275    descrgetfunc tp_descr_get;276    descrsetfunc tp_descr_set;277    Py_ssize_t tp_dictoffset;278    initproc tp_init;279    allocfunc tp_alloc;280    newfunc tp_new;281    freefunc tp_free; /* Низкоуровневая процедура освобождения памяти */282    inquiry tp_is_gc; /* Для PyObject_IS_GC */283    PyObject *tp_bases;284    PyObject *tp_mro; /* порядок разрешения методов */285    PyObject *tp_cache;286    PyObject *tp_subclasses;287    PyObject *tp_weaklist;288    destructor tp_del;289290    /* Метка версии кэша атрибутов типа. Добавлено в версии 2.6. */291    unsigned int tp_version_tag;292293    destructor tp_finalize;294    vectorcallfunc tp_vectorcall;295296    /* битовый набор, указывающий, какие наблюдатели типов следят за этим типом */297    unsigned char tp_watched;298} PyTypeObject;299```300301## Слоты PyObject302303Структура объекта типа расширяет структуру [`PyVarObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyVarObject). Поле [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size) используется для динамических типов (создаваемых с помощью `type_new()`, обычно вызываемого из инструкции class). Обратите внимание, что [`PyType_Type`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Type) (метатип) инициализирует [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize), что означает, что его экземпляры (т.е. объекты типов) *должны* иметь поле `ob_size`.304305#### `Py_ssize_t PyObject.ob_refcnt`306307*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*308309Это счётчик ссылок объекта-типа, инициализируется значением `1` макросом `PyObject_HEAD_INIT`. Обратите внимание: для [статически выделенных объектов-типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types) экземпляры типа (объекты, у которых [`ob_type`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_type) указывает обратно на тип) *не* считаются ссылками. Но для [динамически выделенных объектов-типов](https://python-all.ru/3.13/c-api/typeobj.html#heap-types) экземпляры *действительно* считаются ссылками.310311**Наследование:**312313Это поле не наследуется подтипами.314315#### `PyTypeObject *PyObject.ob_type`316317*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*318319Это тип типа, иными словами, его метатип. Он инициализируется аргументом макроса `PyObject_HEAD_INIT`, и его значением обычно должно быть `&PyType_Type`. Однако для динамически загружаемых модулей расширения, которые должны работать на Windows (по крайней мере), компилятор сообщает, что это недопустимый инициализатор. Поэтому принято передавать `NULL` макросу `PyObject_HEAD_INIT` и явно инициализировать это поле в начале функции инициализации модуля, перед любыми другими действиями. Обычно это делается так:320321```c322Foo_Type.ob_type = &PyType_Type;323```324325Это должно быть сделано до создания любых экземпляров типа. [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) проверяет, равен ли [`ob_type`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_type) значению `NULL`, и если да, инициализирует его значением поля `ob_type` базового класса. `PyType_Ready()` не будет изменять это поле, если оно ненулевое.326327**Наследование:**328329Это поле наследуется подтипами.330331## Слоты PyVarObject332333#### `Py_ssize_t PyVarObject.ob_size`334335*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*336337Для [статически выделенных объектов типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types) это поле должно быть инициализировано нулём. Для [динамически выделенных объектов типов](https://python-all.ru/3.13/c-api/typeobj.html#heap-types) это поле имеет особый внутренний смысл.338339Доступ к этому полю должен осуществляться с помощью макросов [`Py_SIZE()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_SIZE) и [`Py_SET_SIZE()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_SET_SIZE).340341**Наследование:**342343Это поле не наследуется подтипами.344345## Слоты PyTypeObject346347Каждый слот имеет раздел, описывающий наследование. Если [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) может устанавливать значение, когда поле установлено в `NULL`, то также будет раздел «Default» (значение по умолчанию). (Обратите внимание, что многие поля, заданные в [`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) и [`PyType_Type`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Type), фактически действуют как значения по умолчанию.)348349#### `const char *PyTypeObject.tp_name`350351Указатель на строку, завершающуюся NUL, содержащую имя типа. Для типов, доступных как глобальные переменные модуля, строка должна содержать полное имя модуля, за которым следует точка, а затем имя типа; для встроенных типов это должно быть просто имя типа. Если модуль является подмодулем пакета, полное имя пакета является частью полного имени модуля. Например, тип с именем `T`, определённый в модуле `M` в подпакете `Q` пакета `P`, должен иметь инициализатор [`tp_name`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_name) со значением `"P.Q.M.T"`.352353Для [динамически выделенных объектов типов](https://python-all.ru/3.13/c-api/typeobj.html#heap-types) это должно быть просто имя типа, а имя модуля должно быть явно сохранено в словаре типа как значение для ключа `'__module__'`.354355Для [статически размещённых объектов типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types), поле *tp\_name* должно содержать точку. Всё до последней точки становится доступно как атрибут [`__module__`](https://python-all.ru/3.13/reference/datamodel.html#type.__module__), а всё после последней точки – как атрибут [`__name__`](https://python-all.ru/3.13/reference/datamodel.html#type.__name__).356357Если точка отсутствует, всё поле [`tp_name`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_name) становится доступным как атрибут [`__name__`](https://python-all.ru/3.13/reference/datamodel.html#type.__name__), а атрибут [`__module__`](https://python-all.ru/3.13/reference/datamodel.html#type.__module__) не определён (если только не задан явно в словаре, как описано выше). Это означает, что ваш тип невозможно будет сериализовать с помощью pickle. Кроме того, он не будет отображаться в документации модуля, создаваемой pydoc.358359Это поле не должно быть `NULL`. Это единственное обязательное поле в [`PyTypeObject()`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) (кроме потенциально [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize)).360361**Наследование:**362363Это поле не наследуется подтипами.364365#### `Py_ssize_t PyTypeObject.tp_basicsize`366367#### `Py_ssize_t PyTypeObject.tp_itemsize`368369Эти поля позволяют вычислить размер экземпляров типа в байтах.370371Существует два вида типов: типы с экземплярами фиксированной длины имеют нулевое поле `tp_itemsize`, типы с экземплярами переменной длины имеют ненулевое поле `tp_itemsize`. Для типа с экземплярами фиксированной длины все экземпляры имеют одинаковый размер, заданный в `tp_basicsize`. (Исключения из этого правила могут быть сделаны с помощью [`PyUnstable_Object_GC_NewWithExtraData()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyUnstable_Object_GC_NewWithExtraData).)372373Для типа с экземплярами переменной длины экземпляры должны иметь поле [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size), а размер экземпляра равен `tp_basicsize` плюс N раз `tp_itemsize`, где N – это «длина» объекта.374375Функции типа [`PyObject_NewVar()`](https://python-all.ru/3.13/c-api/allocation.html#c.PyObject_NewVar) принимают значение N в качестве аргумента и сохраняют его в поле [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size) экземпляра. Обратите внимание: поле `ob_size` впоследствии может использоваться для других целей. Например, экземпляры [`int`](https://python-all.ru/3.13/library/functions.html#int) используют биты поля `ob_size` способом, определяемым реализацией.376377> **Примечание**378>379> К полю [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size) следует обращаться с помощью макросов [`Py_SIZE()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_SIZE) и [`Py_SET_SIZE()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_SET_SIZE).380381Кроме того, наличие поля [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size) в структуре экземпляра не означает, что структура экземпляра имеет переменную длину. Например, тип [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) имеет экземпляры фиксированной длины, но эти экземпляры содержат поле `ob_size`. (Как и в случае с [`int`](https://python-all.ru/3.13/library/functions.html#int), избегайте прямого чтения `ob_size` списков. Вместо этого вызывайте [`PyList_Size()`](https://python-all.ru/3.13/c-api/list.html#c.PyList_Size).)382383Поле `tp_basicsize` включает размер, необходимый для данных [`tp_base`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_base) типа, а также любые дополнительные данные, необходимые каждому экземпляру.384385Правильный способ установки `tp_basicsize` – использовать оператор `sizeof` для структуры, используемой для объявления структуры экземпляра. Эта структура должна включать структуру, используемую для объявления базового типа. Другими словами, `tp_basicsize` должно быть больше или равно `tp_basicsize` базового типа.386387Поскольку каждый тип является подтипом [`object`](https://python-all.ru/3.13/library/functions.html#object), эта структура должна включать [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) или [`PyVarObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyVarObject) (в зависимости от того, должен ли быть включён [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size)). Обычно они определяются макросом [`PyObject_HEAD`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject_HEAD) или [`PyObject_VAR_HEAD`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject_VAR_HEAD) соответственно.388389Базовый размер не включает размер заголовка GC, поскольку этот заголовок не является частью [`PyObject_HEAD`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject_HEAD).390391Для случаев, когда структура, используемая для объявления базового типа, неизвестна, см. [`PyType_Spec.basicsize`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Spec.basicsize) и [`PyType_FromMetaclass()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromMetaclass).392393Примечания о выравнивании:394395- `tp_basicsize` должно быть кратно `_Alignof(PyObject)`. При использовании `sizeof` в `struct`, включающем [`PyObject_HEAD`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject_HEAD), как рекомендуется, компилятор обеспечивает это. При отказе от C-структуры `struct` или при использовании расширений компилятора, таких как `__attribute__((packed))`, ответственность ложится на вас.396- Если элементы переменной части требуют определённого выравнивания, `tp_basicsize` и `tp_itemsize` должны быть кратны этому выравниванию. Например, если переменная часть типа хранит `double`, вы обязаны убедиться, что оба поля кратны `_Alignof(double)`.397398**Наследование:**399400Эти поля наследуются подтипами по отдельности. (То есть, если поле установлено в ноль, [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) скопирует значение из базового типа, указывая, что экземпляры не нуждаются в дополнительном хранилище.)401402Если базовый тип имеет ненулевое [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize), обычно небезопасно устанавливать `tp_itemsize` в другое ненулевое значение в подтипе (хотя это зависит от реализации базового типа).403404#### `destructor PyTypeObject.tp_dealloc`405406*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_dealloc` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*407408Указатель на функцию-деструктор экземпляра. Эта функция должна быть определена, если только тип не гарантирует, что его экземпляры никогда не будут освобождены (как в случае с синглетонами `None` и `Ellipsis`). Сигнатура функции:409410```c411void tp_dealloc(PyObject *self);412```413414Функция-деструктор вызывается макросами [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) и [`Py_XDECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_XDECREF), когда новое значение счётчика ссылок становится нулевым. В этот момент экземпляр всё ещё существует, но на него нет ссылок. Функция-деструктор должна освободить все ссылки, которыми владеет экземпляр, освободить все буферы памяти, принадлежащие экземпляру (с использованием функции освобождения, соответствующей функции выделения, использованной для выделения буфера), и вызвать функцию [`tp_free`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_free) типа. Если тип не является субтипируемым (не имеет установленного флага [`Py_TPFLAGS_BASETYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_BASETYPE)), допускается вызывать деаллокатор объекта напрямую, а не через `tp_free`. Деаллокатор объекта должен быть тем же, что использовался для выделения экземпляра; обычно это [`PyObject_Del()`](https://python-all.ru/3.13/c-api/allocation.html#c.PyObject_Del), если экземпляр был выделен с помощью [`PyObject_New`](https://python-all.ru/3.13/c-api/allocation.html#c.PyObject_New) или [`PyObject_NewVar`](https://python-all.ru/3.13/c-api/allocation.html#c.PyObject_NewVar), или [`PyObject_GC_Del()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyObject_GC_Del), если экземпляр был выделен с помощью [`PyObject_GC_New`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyObject_GC_New) или [`PyObject_GC_NewVar`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyObject_GC_NewVar).415416Если тип поддерживает сборку мусора (имеет установленный флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) ), деструктор должен вызвать [`PyObject_GC_UnTrack()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyObject_GC_UnTrack) перед очисткой любых полей-членов.417418```c419static void foo_dealloc(foo_object *self) {420    PyObject_GC_UnTrack(self);421    Py_CLEAR(self->ref);422    Py_TYPE(self)->tp_free((PyObject *)self);423}424```425426Наконец, если тип выделен в куче ([`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE)), деаллокатор должен освободить принадлежащую ему ссылку на объект-тип (через [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF)) после вызова деаллокатора типа. Чтобы избежать висячих указателей, рекомендуемый способ сделать это:427428```c429static void foo_dealloc(foo_object *self) {430    PyTypeObject *tp = Py_TYPE(self);431    // Освободить ссылки и буферы здесь.432    tp->tp_free(self);433    Py_DECREF(tp);434}435```436437> **Предупреждение**438>439> В Python со сборкой мусора `tp_dealloc` может вызываться из любого потока Python, а не только из потока, создавшего объект (если объект становится частью цикла ссылок, этот цикл может быть собран сборщиком мусора в любом потоке). Это не проблема для вызовов API Python, поскольку поток, в котором вызывается `tp_dealloc`, будет владеть Глобальной блокировкой интерпретатора (GIL). Однако, если уничтожаемый объект в свою очередь уничтожает объекты из какой-либо другой библиотеки C или C++, следует проявить осторожность, чтобы уничтожение этих объектов в потоке, вызвавшем `tp_dealloc`, не нарушило никаких предположений библиотеки.440441**Наследование:**442443Это поле наследуется подтипами.444445#### `Py_ssize_t PyTypeObject.tp_vectorcall_offset`446447Необязательное смещение к поинстансной функции, реализующей вызов объекта с помощью [протокола vectorcall](https://python-all.ru/3.13/c-api/call.html#vectorcall), более эффективная альтернатива более простому [`tp_call`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_call).448449Это поле используется только в том случае, если установлен флаг [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL) . В этом случае оно должно быть положительным целым числом, содержащим смещение в экземпляре указателя [`vectorcallfunc`](https://python-all.ru/3.13/c-api/call.html#c.vectorcallfunc).450451Указатель *vectorcallfunc* может быть `NULL`, и в этом случае экземпляр ведёт себя так, как если бы [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL) не был установлен: вызов экземпляра сводится к [`tp_call`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_call).452453Любой класс, устанавливающий `Py_TPFLAGS_HAVE_VECTORCALL`, должен также установить [`tp_call`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_call) и убедиться, что его поведение согласуется с функцией *vectorcallfunc*. Это можно сделать, установив *tp\_call* в [`PyVectorcall_Call()`](https://python-all.ru/3.13/c-api/call.html#c.PyVectorcall_Call).454455Изменено в версии 3.8: До версии 3.8 этот слот назывался `tp_print`. В Python 2.x он использовался для вывода в файл. В Python 3.0–3.7 он не использовался.456457Изменено в версии 3.12: До версии 3.12 не рекомендовалось для [изменяемых типов, размещаемых в куче](https://python-all.ru/3.13/c-api/typeobj.html#heap-types) реализовывать протокол vectorcall. Когда пользователь устанавливает [`__call__`](https://python-all.ru/3.13/reference/datamodel.html#object.__call__) в коде Python, обновляется только *tp\_call*, что, вероятно, делает его несовместимым с функцией vectorcall. Начиная с версии 3.12, установка `__call__` отключает оптимизацию vectorcall путём сброса флага [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL).458459**Наследование:**460461Это поле всегда наследуется. Однако флаг [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL) наследуется не всегда. Если он не установлен, то подкласс не будет использовать [vectorcall](https://python-all.ru/3.13/c-api/call.html#vectorcall), за исключением случаев, когда [`PyVectorcall_Call()`](https://python-all.ru/3.13/c-api/call.html#c.PyVectorcall_Call) вызывается явно.462463#### `getattrfunc PyTypeObject.tp_getattr`464465*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_getattr` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*466467Необязательный указатель на функцию получения строки атрибута.468469Это поле устарело. Если оно определено, оно должно указывать на функцию, которая действует так же, как функция [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro), но принимает C-строку вместо строкового объекта Python для указания имени атрибута.470471**Наследование:**472473Группа: [`tp_getattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattr), [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro)474475Это поле наследуется подтипами вместе с [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro): подтип наследует и [`tp_getattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattr), и `tp_getattro` от своего базового типа, когда `tp_getattr` и `tp_getattro` подтипа оба равны `NULL`.476477#### `setattrfunc PyTypeObject.tp_setattr`478479*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_setattr` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*480481Необязательный указатель на функцию для установки и удаления атрибутов.482483Это поле устарело. Если оно определено, оно должно указывать на функцию, которая действует так же, как функция [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro), но принимает C-строку вместо строкового объекта Python для указания имени атрибута.484485**Наследование:**486487Группа: [`tp_setattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattr), [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro)488489Это поле наследуется подтипами вместе с [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro): подтип наследует и [`tp_setattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattr), и `tp_setattro` от своего базового типа, когда `tp_setattr` и `tp_setattro` подтипа оба равны `NULL`.490491#### `PyAsyncMethods *PyTypeObject.tp_as_async`492493Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протоколы [ожидаемого объекта](https://python-all.ru/3.13/glossary.html#term-awaitable) и [асинхронного итератора](https://python-all.ru/3.13/glossary.html#term-asynchronous-iterator) на уровне C. Подробнее см. в [Структуры асинхронных объектов](https://python-all.ru/3.13/c-api/typeobj.html#async-structs).494495Добавлено в версии 3.5: Ранее было известно как `tp_compare` и `tp_reserved`.496497**Наследование:**498499Поле [`tp_as_async`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_async) не наследуется, но содержащиеся в нем поля наследуются по отдельности.500501#### `reprfunc PyTypeObject.tp_repr`502503*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_repr` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*504505Необязательный указатель на функцию, реализующую встроенную функцию [`repr()`](https://python-all.ru/3.13/library/functions.html#repr).506507Сигнатура такая же, как для [`PyObject_Repr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Repr):508509```c510PyObject *tp_repr(PyObject *self);511```512513Функция должна возвращать строку или объект Unicode. В идеале она должна возвращать строку, которая при передаче в [`eval()`](https://python-all.ru/3.13/library/functions.html#eval) в подходящем окружении возвращает объект с тем же значением. Если это невозможно, она должна возвращать строку, начинающуюся с `'<'` и заканчивающуюся `'>'`, из которой можно вывести как тип, так и значение объекта.514515**Наследование:**516517Это поле наследуется подтипами.518519**По умолчанию:**520521Если это поле не задано, возвращается строка вида `<%s object at %p>`, где `%s` заменяется именем типа, а `%p` – адресом памяти объекта.522523#### `PyNumberMethods *PyTypeObject.tp_as_number`524525Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих числовой протокол. Эти поля описаны в [Структуры числовых объектов](https://python-all.ru/3.13/c-api/typeobj.html#number-structs).526527**Наследование:**528529Поле [`tp_as_number`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_number) не наследуется, но содержащиеся в нём поля наследуются по отдельности.530531#### `PySequenceMethods *PyTypeObject.tp_as_sequence`532533Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протокол последовательности. Эти поля описаны в [Структуры объектов-последовательностей](https://python-all.ru/3.13/c-api/typeobj.html#sequence-structs).534535**Наследование:**536537Поле [`tp_as_sequence`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_sequence) не наследуется, но содержащиеся в нём поля наследуются по отдельности.538539#### `PyMappingMethods *PyTypeObject.tp_as_mapping`540541Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протокол отображения. Эти поля описаны в [Структуры объектов-отображений](https://python-all.ru/3.13/c-api/typeobj.html#mapping-structs).542543**Наследование:**544545Поле [`tp_as_mapping`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_mapping) не наследуется, но содержащиеся в нём поля наследуются по отдельности.546547#### `hashfunc PyTypeObject.tp_hash`548549*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_hash` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*550551Необязательный указатель на функцию, реализующую встроенную функцию [`hash()`](https://python-all.ru/3.13/library/functions.html#hash).552553Сигнатура такая же, как для [`PyObject_Hash()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Hash):554555```c556Py_hash_t tp_hash(PyObject *);557```558559Значение `-1` не должно возвращаться как обычное возвращаемое значение; при возникновении ошибки во время вычисления хеш-значения функция должна установить исключение и вернуть `-1`.560561Если это поле не задано (*и* [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) не задано), то попытка получить хеш объекта вызывает [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError). Это то же самое, что установить его в [`PyObject_HashNotImplemented()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_HashNotImplemented).562563Это поле можно явно установить в [`PyObject_HashNotImplemented()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_HashNotImplemented), чтобы заблокировать наследование хеш-метода от родительского типа. Это интерпретируется как эквивалент `__hash__ = None` на уровне Python, в результате чего `isinstance(o, collections.Hashable)` корректно возвращает `False`. Обратите внимание, что верно и обратное: установка `__hash__ = None` в классе на уровне Python приведет к тому, что слот `tp_hash` будет установлен в `PyObject_HashNotImplemented()`.564565**Наследование:**566567Группа: [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash), [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare)568569Это поле наследуется подтипами вместе с [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare): подтип наследует как `tp_richcompare`, так и [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash), если `tp_richcompare` и `tp_hash` подтипа равны `NULL`.570571**По умолчанию:**572573[`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_GenericHash()`](https://python-all.ru/3.13/c-api/hash.html#c.PyObject_GenericHash).574575#### `ternaryfunc PyTypeObject.tp_call`576577*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_call` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*578579Необязательный указатель на функцию, реализующую вызов объекта. Это значение должно быть `NULL`, если объект не является вызываемым. Сигнатура такая же, как у [`PyObject_Call()`](https://python-all.ru/3.13/c-api/call.html#c.PyObject_Call):580581```c582PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);583```584585**Наследование:**586587Это поле наследуется подтипами.588589#### `reprfunc PyTypeObject.tp_str`590591*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_str` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*592593Необязательный указатель на функцию, реализующую встроенную операцию [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str). (Обратите внимание, что [`str`](https://python-all.ru/3.13/library/stdtypes.html#str) теперь является типом, а `str()` вызывает конструктор этого типа. Этот конструктор вызывает [`PyObject_Str()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Str) для выполнения фактической работы, и `PyObject_Str()` будет вызывать этот обработчик.)594595Сигнатура такая же, как для [`PyObject_Str()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Str):596597```c598PyObject *tp_str(PyObject *self);599```600601Функция должна возвращать строку или объект Unicode. Это должно быть «дружественное» строковое представление объекта, так как это представление будет использоваться, в частности, функцией [`print()`](https://python-all.ru/3.13/library/functions.html#print).602603**Наследование:**604605Это поле наследуется подтипами.606607**По умолчанию:**608609Если это поле не задано, вызывается [`PyObject_Repr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Repr) для возврата строкового представления.610611#### `getattrofunc PyTypeObject.tp_getattro`612613*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_getattro` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*614615Необязательный указатель на функцию получения атрибута.616617Сигнатура такая же, как для [`PyObject_GetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetAttr):618619```c620PyObject *tp_getattro(PyObject *self, PyObject *attr);621```622623Обычно удобно установить это поле в [`PyObject_GenericGetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GenericGetAttr), которое реализует обычный способ поиска атрибутов объекта.624625**Наследование:**626627Группа: [`tp_getattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattr), [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro)628629Это поле наследуется подтипами вместе с [`tp_getattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattr): подтип наследует и `tp_getattr`, и [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro) от своего базового типа, когда `tp_getattr` и `tp_getattro` подтипа оба равны `NULL`.630631**По умолчанию:**632633[`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_GenericGetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GenericGetAttr).634635#### `setattrofunc PyTypeObject.tp_setattro`636637*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_setattro` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*638639Необязательный указатель на функцию для установки и удаления атрибутов.640641Сигнатура такая же, как для [`PyObject_SetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_SetAttr):642643```c644int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);645```646647Кроме того, установка *value* в `NULL` для удаления атрибута должна поддерживаться. Обычно удобно устанавливать это поле в [`PyObject_GenericSetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GenericSetAttr), которое реализует обычный способ установки атрибутов объекта.648649**Наследование:**650651Группа: [`tp_setattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattr), [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro)652653Это поле наследуется подтипами вместе с [`tp_setattr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattr): подтип наследует и `tp_setattr`, и [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro) от своего базового типа, когда `tp_setattr` и `tp_setattro` подтипа оба равны `NULL`.654655**По умолчанию:**656657[`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_GenericSetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GenericSetAttr).658659#### `PyBufferProcs *PyTypeObject.tp_as_buffer`660661Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих буферный интерфейс. Эти поля описаны в [Buffer Object Structures](https://python-all.ru/3.13/c-api/typeobj.html#buffer-structs).662663**Наследование:**664665Поле [`tp_as_buffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer) не наследуется, но содержащиеся в нем поля наследуются по отдельности.666667#### `unsigned long PyTypeObject.tp_flags`668669Это поле представляет собой битовую маску различных флагов. Некоторые флаги указывают на изменённую семантику для определённых ситуаций; другие используются для указания того, что определённые поля в объекте типа (или в расширяющих структурах, на которые ссылаются через [`tp_as_number`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_number), [`tp_as_sequence`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_sequence), [`tp_as_mapping`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_mapping) и [`tp_as_buffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer)), которые исторически не всегда присутствовали, теперь действительны; если такой бит флага сброшен, то поля типа, которые он защищает, не должны использоваться и должны считаться имеющими значение ноль или `NULL`.670671**Наследование:**672673Наследование этого поля устроено сложно. Большинство битов флагов наследуются индивидуально: если у базового типа установлен бит флага, подтип наследует этот бит. Биты флагов, относящиеся к структурам расширения, наследуются строго вместе с самой структурой расширения – значение бита флага базового типа копируется в подтип вместе с указателем на структуру расширения. Бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) наследуется вместе с полями [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear): если в подтипе бит `Py_TPFLAGS_HAVE_GC` сброшен, а поля `tp_traverse` и `tp_clear` в подтипе существуют и имеют значения `NULL`. .. XXX *действительно* ли большинство битов флагов наследуются индивидуально?674675**По умолчанию:**676677[`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) использует `Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE`.678679**Битовые маски:**680681В настоящее время определены следующие битовые маски; их можно объединять с помощью оператора `|` для получения значения поля [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags). Макрос [`PyType_HasFeature()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_HasFeature) принимает тип и значение флагов, *tp* и *f*, и проверяет, является ли `tp->tp_flags & f` ненулевым.682683#### `Py_TPFLAGS_HEAPTYPE`684685Этот бит устанавливается, когда сам объект типа выделяется в куче, например, типы, созданные динамически с помощью [`PyType_FromSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpec). В этом случае поле [`ob_type`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_type) его экземпляров считается ссылкой на тип, и объект типа инкрементируется (INCREF) при создании нового экземпляра, и декрементируется (DECREF) при уничтожении экземпляра (это не относится к экземплярам подтипов; только тип, на который ссылается ob\_type экземпляра, инкрементируется или декрементируется). Типы в куче также должны [поддерживать сборку мусора](https://python-all.ru/3.13/c-api/gcsupport.html#supporting-cycle-detection) так как они могут образовывать циклические ссылки с собственным объектом модуля.686687**Наследование:**688689???690691#### `Py_TPFLAGS_BASETYPE`692693*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*694695Этот бит устанавливается, когда тип может использоваться как базовый тип другого типа. Если этот бит сброшен, тип не может быть унаследован (аналогично «финальному» классу в Java).696697**Наследование:**698699???700701#### `Py_TPFLAGS_READY`702703Этот бит устанавливается, когда объект типа был полностью инициализирован функцией [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready).704705**Наследование:**706707???708709#### `Py_TPFLAGS_READYING`710711Этот бит устанавливается, пока [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) находится в процессе инициализации объекта типа.712713**Наследование:**714715???716717#### `Py_TPFLAGS_HAVE_GC`718719*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*720721Этот бит устанавливается, когда объект поддерживает сборку мусора. Если бит установлен, экземпляры должны создаваться с помощью [`PyObject_GC_New`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyObject_GC_New) и уничтожаться с помощью [`PyObject_GC_Del()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyObject_GC_Del). Дополнительная информация – в разделе [Поддержка циклической сборки мусора](https://python-all.ru/3.13/c-api/gcsupport.html#supporting-cycle-detection). Этот бит также означает, что связанные со сборкой мусора поля [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) присутствуют в объекте типа.722723**Наследование:**724725Группа: [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse), [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear)726727Бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) наследуется вместе с полями [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear), то есть если бит флага `Py_TPFLAGS_HAVE_GC` сброшен в подтипе, а поля `tp_traverse` и `tp_clear` в подтипе существуют и имеют значения `NULL`.728729#### `Py_TPFLAGS_DEFAULT`730731*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*732733Это битовая маска всех битов, относящихся к наличию определённых полей в объекте типа и его структурах расширения. В настоящее время она включает следующие биты: [`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_STACKLESS_EXTENSION).734735**Наследование:**736737???738739#### `Py_TPFLAGS_METHOD_DESCRIPTOR`740741*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) с версии 3.8.*742743Этот бит указывает, что объекты ведут себя как несвязанные методы.744745Если этот флаг установлен для `type(meth)`, то:746747- `meth.__get__(obj, cls)(*args, **kwds)` (при `obj` не None) должен быть эквивалентен `meth(obj, *args, **kwds)`.748- `meth.__get__(None, cls)(*args, **kwds)` должен быть эквивалентен `meth(*args, **kwds)`.749750Этот флаг включает оптимизацию для типичных вызовов методов, таких как `obj.meth()`: он позволяет избежать создания временного объекта «связанный метод» для `obj.meth`.751752Добавлено в версии 3.8.753754**Наследование:**755756Этот флаг никогда не наследуется типами, у которых не установлен флаг [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE). Для типов расширения он наследуется всякий раз, когда наследуется [`tp_descr_get`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_descr_get).757758#### `Py_TPFLAGS_MANAGED_DICT`759760Этот бит указывает, что экземпляры класса имеют атрибут [`__dict__`](https://python-all.ru/3.13/reference/datamodel.html#object.__dict__), и что память для словаря управляется виртуальной машиной.761762Если этот флаг установлен, [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) также должен быть установлен.763764Функция обхода типа должна вызывать [`PyObject_VisitManagedDict()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_VisitManagedDict), а функция очистки должна вызывать [`PyObject_ClearManagedDict()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_ClearManagedDict).765766Добавлено в версии 3.12.767768**Наследование:**769770Этот флаг наследуется, если только поле [`tp_dictoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) не установлено в суперклассе.771772#### `Py_TPFLAGS_MANAGED_WEAKREF`773774Этот бит указывает, что экземпляры класса должны поддерживать слабые ссылки.775776Добавлено в версии 3.12.777778**Наследование:**779780Этот флаг наследуется, если только поле [`tp_weaklistoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) не установлено в суперклассе.781782#### `Py_TPFLAGS_ITEMS_AT_END`783784*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*785786Применим только к типам переменного размера, то есть с ненулевым [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize).787788Указывает, что часть переменного размера экземпляра этого типа находится в конце области памяти экземпляра, со смещением `Py_TYPE(obj)->tp_basicsize` (которое может отличаться в каждом подклассе).789790При установке этого флага убедитесь, что все суперклассы либо используют такое же расположение в памяти, либо не являются типами переменного размера. Python не проверяет это условие.791792Добавлено в версии 3.12.793794**Наследование:**795796Этот флаг наследуется.797798#### `Py_TPFLAGS_LONG_SUBCLASS`799800#### `Py_TPFLAGS_LIST_SUBCLASS`801802#### `Py_TPFLAGS_TUPLE_SUBCLASS`803804#### `Py_TPFLAGS_BYTES_SUBCLASS`805806#### `Py_TPFLAGS_UNICODE_SUBCLASS`807808#### `Py_TPFLAGS_DICT_SUBCLASS`809810#### `Py_TPFLAGS_BASE_EXC_SUBCLASS`811812#### `Py_TPFLAGS_TYPE_SUBCLASS`813814Такие функции, как [`PyLong_Check()`](https://python-all.ru/3.13/c-api/long.html#c.PyLong_Check), вызывают [`PyType_FastSubclass()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FastSubclass) с одним из этих флагов, чтобы быстро определить, является ли тип подклассом встроенного типа; такие конкретные проверки выполняются быстрее, чем общая проверка, например [`PyObject_IsInstance()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_IsInstance). Пользовательские типы, наследуемые от встроенных, должны иметь соответствующим образом установленный [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags), иначе код, взаимодействующий с такими типами, будет вести себя по-разному в зависимости от того, какая проверка используется.815816#### `Py_TPFLAGS_HAVE_FINALIZE`817818Этот бит устанавливается, когда слот [`tp_finalize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_finalize) присутствует в структуре типа.819820Добавлено в версии 3.4.821822Устарело с версии 3.8: Этот флаг больше не нужен, так как интерпретатор предполагает, что слот [`tp_finalize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_finalize) всегда присутствует в структуре типа.823824#### `Py_TPFLAGS_HAVE_VECTORCALL`825826*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*827828Этот бит устанавливается, когда класс реализует [протокол vectorcall](https://python-all.ru/3.13/c-api/call.html#vectorcall). Подробнее см. [`tp_vectorcall_offset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset).829830**Наследование:**831832Этот бит наследуется, если [`tp_call`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_call) также наследуется.833834Добавлено в версии 3.8: как `_Py_TPFLAGS_HAVE_VECTORCALL`835836Изменено в версии 3.9.837838Переименован в текущее имя, без ведущего подчеркивания. Прежнее временное имя [мягко устарело](https://python-all.ru/3.13/glossary.html#term-soft-deprecated).839840Изменено в версии 3.12: Теперь этот флаг удаляется из класса, когда [`__call__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__call__) методу класса присваивается новое значение.841842Теперь этот флаг может наследоваться изменяемыми классами.843844#### `Py_TPFLAGS_IMMUTABLETYPE`845846Этот бит устанавливается для объектов типа, которые являются неизменяемыми: атрибуты типа нельзя ни установить, ни удалить.847848[`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) автоматически применяет этот флаг к [статическим типам](https://python-all.ru/3.13/c-api/typeobj.html#static-types).849850**Наследование:**851852Этот флаг не наследуется.853854Добавлено в версии 3.10.855856#### `Py_TPFLAGS_DISALLOW_INSTANTIATION`857858Запретить создание экземпляров типа: установить [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) в NULL и не создавать ключ `__new__` в словаре типа.859860Флаг должен быть установлен до создания типа, а не после. Например, его нужно установить до вызова [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) для этого типа.861862Флаг устанавливается автоматически для [статических типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types), если [`tp_base`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_base) равен NULL или `&PyBaseObject_Type`, и [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) равен NULL.863864**Наследование:**865866Этот флаг не наследуется. Однако подклассы нельзя будет инстанцировать, если они не предоставят ненулевой [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) (что возможно только через C API).867868> **Примечание**869>870> Чтобы запретить прямое создание экземпляров класса, но разрешить создание его подклассов (например, для [абстрактного базового класса](https://python-all.ru/3.13/glossary.html#term-abstract-base-class)), не используйте этот флаг. Вместо этого добейтесь, чтобы [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) завершался успешно только для подклассов.871872Добавлено в версии 3.10.873874#### `Py_TPFLAGS_MAPPING`875876Этот бит указывает, что экземпляры класса могут сопоставляться с шаблонами отображений при использовании в качестве объекта оператора [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match). Он автоматически устанавливается при регистрации или наследовании [`collections.abc.Mapping`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Mapping) и сбрасывается при регистрации [`collections.abc.Sequence`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Sequence).877878> **Примечание**879>880> [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING) и [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE) взаимоисключающие; одновременная активация обоих флагов является ошибкой.881882**Наследование:**883884Этот флаг наследуется типами, которые ещё не установили [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE).885886> **См. также**887>888> [**PEP 634**](https://python-all.ru/3.13/c-api/typeobj.html) – Структурное сопоставление с образцом: спецификация889890Добавлено в версии 3.10.891892#### `Py_TPFLAGS_SEQUENCE`893894Этот бит указывает, что экземпляры класса могут сопоставляться с шаблонами последовательностей при использовании в качестве объекта оператора [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match). Он автоматически устанавливается при регистрации или наследовании [`collections.abc.Sequence`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Sequence) и сбрасывается при регистрации [`collections.abc.Mapping`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Mapping).895896> **Примечание**897>898> [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING) и [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE) взаимоисключающие; одновременная активация обоих флагов является ошибкой.899900**Наследование:**901902Этот флаг наследуется типами, которые ещё не установили [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING).903904> **См. также**905>906> [**PEP 634**](https://python-all.ru/3.13/c-api/typeobj.html) – Структурное сопоставление с образцом: спецификация907908Добавлено в версии 3.10.909910#### `Py_TPFLAGS_VALID_VERSION_TAG`911912Внутренний флаг. Не устанавливайте и не сбрасывайте этот флаг. Чтобы указать, что класс изменился, вызовите [`PyType_Modified()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Modified)913914> **Предупреждение**915>916> Этот флаг присутствует в заголовочных файлах, но не используется. Он будет удалён в будущей версии CPython.917918#### `Py_TPFLAGS_HAVE_VERSION_TAG`919920Это макрос [мягко устаревший](https://python-all.ru/3.13/glossary.html#term-soft-deprecated), который ничего не делает. Исторически он указывал, что поле [`tp_version_tag`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_version_tag) доступно и инициализировано.921922#### `Py_TPFLAGS_INLINE_VALUES`923924Этот бит указывает, что экземпляры этого типа будут иметь массив «встроенных значений», содержащий атрибуты объекта, размещённый сразу после конца объекта.925926Для этого необходимо, чтобы был установлен [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).927928**Наследование:**929930Этот флаг не наследуется.931932Добавлено в версии 3.13.933934#### `Py_TPFLAGS_IS_ABSTRACT`935936Этот бит указывает, что это абстрактный тип и поэтому не может быть инстанцирован.937938**Наследование:**939940Этот флаг не наследуется.941942> **См. также**943>944> [`abc`](https://python-all.ru/3.13/library/abc.html#module-abc)945946#### `Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`947948Внутренний. Не устанавливайте и не снимайте этот флаг. Исторически это был зарезервированный флаг для использования в Stackless Python.949950> **Предупреждение**951>952> Этот флаг присутствует в заголовочных файлах, но не используется. Он может быть удалён в будущей версии CPython.953954#### `const char *PyTypeObject.tp_doc`955956*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_doc` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*957958Необязательный указатель на C-строку, завершающуюся символом NUL, содержащую строку документации для данного объекта типа. Он доступен как атрибут [`__doc__`](https://python-all.ru/3.13/reference/datamodel.html#type.__doc__) у типа и его экземпляров.959960**Наследование:**961962Это поле *не* наследуется подтипами.963964#### `traverseproc PyTypeObject.tp_traverse`965966*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_traverse` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*967968Необязательный указатель на функцию обхода для сборщика мусора. Используется только если установлен бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC). Сигнатура:969970```c971int tp_traverse(PyObject *self, visitproc visit, void *arg);972```973974Дополнительная информация о схеме сборки мусора в Python доступна в разделе [Поддержка циклической сборки мусора](https://python-all.ru/3.13/c-api/gcsupport.html#supporting-cycle-detection).975976Указатель [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) используется сборщиком мусора для обнаружения циклических ссылок. Типичная реализация функции `tp_traverse` просто вызывает [`Py_VISIT()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.Py_VISIT) для каждого элемента экземпляра, являющегося объектом Python, которым владеет экземпляр. Например, это функция `local_traverse()` из модуля расширения `_thread`:977978```c979static int980local_traverse(localobject *self, visitproc visit, void *arg)981{982    Py_VISIT(self->args);983    Py_VISIT(self->kw);984    Py_VISIT(self->dict);985    return 0;986}987```988989Обратите внимание, что [`Py_VISIT()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.Py_VISIT) вызывается только для тех членов, которые могут участвовать в циклических ссылках. Хотя есть также член `self->key`, он может быть только `NULL` или строкой Python и поэтому не может быть частью циклической ссылки.990991С другой стороны, даже если известно, что член никогда не может быть частью цикла, в качестве средства отладки его всё равно можно обойти, чтобы функция [`get_referents()`](https://python-all.ru/3.13/library/gc.html#gc.get_referents) модуля [`gc`](https://python-all.ru/3.13/library/gc.html#module-gc) включила его.992993Кучевые типы ([`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE)) должны обходить свой тип с помощью:994995```c996Py_VISIT(Py_TYPE(self));997```998999Это требуется только начиная с Python 3.9. Для поддержки Python 3.8 и старше эта строка должна быть условной:10001001```c1002#if PY_VERSION_HEX >= 0x030900001003    Py_VISIT(Py_TYPE(self));1004#endif1005```10061007Если бит [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) установлен в поле [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags), функция обхода должна вызвать [`PyObject_VisitManagedDict()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_VisitManagedDict) следующим образом:10081009```c1010PyObject_VisitManagedDict((PyObject*)self, visit, arg);1011```10121013> **Предупреждение**1014>1015> При реализации [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) должны обходиться только те члены, которыми экземпляр *владеет* (имея на них [сильные ссылки](https://python-all.ru/3.13/glossary.html#term-strong-reference)). Например, если объект поддерживает слабые ссылки через слот [`tp_weaklist`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklist), указатель, поддерживающий связанный список (то, на что указывает *tp\_weaklist*), **не** должен обходиться, поскольку экземпляр не владеет напрямую слабыми ссылками на себя (список слабых ссылок существует для поддержки механизма слабых ссылок, но у экземпляра нет сильной ссылки на элементы внутри него, так как они могут быть удалены, даже если экземпляр всё ещё жив).10161017> **Предупреждение**1018>1019> Функция обхода не должна иметь побочных эффектов. Она не должна изменять счётчики ссылок каких-либо объектов Python, а также создавать или уничтожать какие-либо объекты Python.10201021Обратите внимание, что [`Py_VISIT()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.Py_VISIT) требует, чтобы параметры *visit* и *arg* для `local_traverse()` имели именно такие имена; не следует называть их как попало.10221023Экземпляры [кучевых типов](https://python-all.ru/3.13/c-api/typeobj.html#heap-types) содержат ссылку на свой тип. Поэтому их функция обхода должна либо обходить [`Py_TYPE(self)`](https://python-all.ru/3.13/c-api/structures.html#c.Py_TYPE), либо делегировать эту ответственность путём вызова `tp_traverse` другого кучевого типа (например, кучевого суперкласса). Если этого не сделать, объект типа может не быть собран сборщиком мусора.10241025Изменено в версии 3.9: Ожидается, что типы, выделяемые в куче, будут посещать `Py_TYPE(self)` в `tp_traverse`. В более ранних версиях Python из-за [ошибки 40217](https://python-all.ru/3.13/c-api/typeobj.html) это могло приводить к сбоям в подклассах.10261027**Наследование:**10281029Группа: [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse), [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear)10301031Это поле наследуется подтипами вместе с [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) и флагом [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC): флаг, [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и `tp_clear` наследуются от базового типа, если они равны нулю в подтипе.10321033#### `inquiry PyTypeObject.tp_clear`10341035*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_clear` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*10361037Необязательный указатель на функцию очистки для сборщика мусора. Используется только если установлен флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC). Сигнатура:10381039```c1040int tp_clear(PyObject *);1041```10421043Функция-член [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) используется для разрыва циклических ссылок в циклическом мусоре, обнаруженном сборщиком мусора. В совокупности все функции `tp_clear` в системе должны совместно разрывать все циклические ссылки. Это тонкий момент, и при любых сомнениях следует предоставить функцию `tp_clear`. Например, тип tuple не реализует функцию `tp_clear`, поскольку можно доказать, что ни одна циклическая ссылка не может состоять исключительно из кортежей. Поэтому функции `tp_clear` других типов должны быть достаточны для разрыва любой циклической ссылки, содержащей кортеж. Это не очевидно, и редко есть веская причина избегать реализации `tp_clear`.10441045Реализации [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) должны удалять ссылки экземпляра на те его члены, которые могут являться объектами Python, и устанавливать указатели на эти члены в `NULL`, как показано в следующем примере:10461047```c1048static int1049local_clear(localobject *self)1050{1051    Py_CLEAR(self->key);1052    Py_CLEAR(self->args);1053    Py_CLEAR(self->kw);1054    Py_CLEAR(self->dict);1055    return 0;1056}1057```10581059Следует использовать макрос [`Py_CLEAR()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_CLEAR), потому что очистка ссылок – это деликатная операция: ссылка на содержащийся объект не должна освобождаться (через [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF)) до тех пор, пока указатель на содержащийся объект не будет установлен в `NULL`. Это связано с тем, что освобождение ссылки может привести к тому, что содержащийся объект станет мусором, что вызовет цепочку действий по его утилизации, которая может включать выполнение произвольного кода Python (из-за финализаторов или колбэков слабых ссылок, связанных с содержащимся объектом). Если такой код может снова сослаться на *self*, важно, чтобы указатель на содержащийся объект в этот момент был `NULL`, чтобы *self* знал, что содержащийся объект больше нельзя использовать. Макрос `Py_CLEAR()` выполняет операции в безопасном порядке.10601061Если бит [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) установлен в поле [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags), функция очистки должна вызвать [`PyObject_ClearManagedDict()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_ClearManagedDict) следующим образом:10621063```c1064PyObject_ClearManagedDict((PyObject*)self);1065```10661067Обратите внимание, что [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) вызывается не *всегда* перед освобождением экземпляра. Например, когда подсчёта ссылок достаточно, чтобы определить, что объект больше не используется, циклический сборщик мусора не задействуется, и [`tp_dealloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dealloc) вызывается напрямую.10681069Поскольку цель функций [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) – разрывать циклические ссылки, нет необходимости очищать содержащиеся объекты, такие как строки Python или целые числа Python, которые не могут участвовать в циклических ссылках. С другой стороны, может быть удобно очистить все содержащиеся объекты Python и написать функцию [`tp_dealloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dealloc) типа так, чтобы она вызывала `tp_clear`.10701071Дополнительную информацию о схеме сборки мусора Python можно найти в разделе [Поддержка циклической сборки мусора](https://python-all.ru/3.13/c-api/gcsupport.html#supporting-cycle-detection).10721073**Наследование:**10741075Группа: [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse), [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear)10761077Это поле наследуется подтипами вместе с [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и флагом [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC): флаг, `tp_traverse` и [`tp_clear`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_clear) наследуются от базового типа, если они равны нулю в подтипе.10781079#### `richcmpfunc PyTypeObject.tp_richcompare`10801081*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_richcompare` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*10821083Необязательный указатель на функцию расширенного сравнения, сигнатура которой:10841085```c1086PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);1087```10881089Первый параметр гарантированно является экземпляром типа, определяемого через [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject).10901091Функция должна возвращать результат сравнения (обычно `Py_True` или `Py_False`). Если сравнение не определено, она должна вернуть `Py_NotImplemented`; если произошла другая ошибка, она должна вернуть `NULL` и установить условие исключения.10921093Следующие константы определены для использования в качестве третьего аргумента для [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) и для [`PyObject_RichCompare()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_RichCompare):10941095| Константа | Сравнение |1096| --- | --- |1097| Py\_LT | `<` |1098| Py\_LE | `<=` |1099| Py\_EQ | `==` |1100| Py\_NE | `!=` |1101| Py\_GT | `>` |1102| Py\_GE | `>=` |11031104Для упрощения написания функций расширенного сравнения определён следующий макрос:11051106#### `Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, op)`11071108Возвращает `Py_True` или `Py_False` из функции в зависимости от результата сравнения. VAL\_A и VAL\_B должны быть упорядочиваемыми с помощью операторов сравнения языка C (например, это могут быть значения типа int или float). Третий аргумент задаёт требуемую операцию, как и для [`PyObject_RichCompare()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_RichCompare).11091110Возвращаемое значение – это новая [сильная ссылка](https://python-all.ru/3.13/glossary.html#term-strong-reference).11111112В случае ошибки устанавливает исключение и возвращает `NULL` из функции.11131114Добавлено в версии 3.7.11151116**Наследование:**11171118Группа: [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash), [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare)11191120Это поле наследуется подтипами вместе с [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash): подтип наследует [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) и `tp_hash`, когда `tp_richcompare` и `tp_hash` подтипа оба `NULL`.11211122**По умолчанию:**11231124[`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) предоставляет реализацию [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare), которая может быть унаследована. Однако, если определено только [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash), унаследованная функция не используется, и экземпляры типа не смогут участвовать в сравнениях.11251126#### `Py_ssize_t PyTypeObject.tp_weaklistoffset`11271128Хотя это поле всё ещё поддерживается, [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) следует использовать вместо него, если это возможно.11291130Если экземпляры этого типа поддерживают слабые ссылки, это поле больше нуля и содержит смещение в структуре экземпляра до головы списка слабых ссылок (игнорируя заголовок GC, если он присутствует); это смещение используется функциями [`PyObject_ClearWeakRefs()`](https://python-all.ru/3.13/c-api/weakref.html#c.PyObject_ClearWeakRefs) и `PyWeakref_*`. Структура экземпляра должна содержать поле типа [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject)\*, которое инициализируется `NULL`.11311132Не путайте это поле с [`tp_weaklist`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklist); это голова списка для слабых ссылок на сам объект типа.11331134Установка обоих битов [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) и [`tp_weaklistoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) является ошибкой.11351136**Наследование:**11371138Это поле наследуется подтипами, но см. правила ниже. Подтип может переопределить это смещение; это означает, что подтип использует другую голову списка слабых ссылок, нежели базовый тип. Поскольку голова списка всегда находится через [`tp_weaklistoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset), это не должно быть проблемой.11391140**По умолчанию:**11411142Если бит [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) установлен в поле [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags), то [`tp_weaklistoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) будет установлено в отрицательное значение, чтобы указать, что использовать это поле небезопасно.11431144#### `getiterfunc PyTypeObject.tp_iter`11451146*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_iter` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*11471148Необязательный указатель на функцию, возвращающую [итератор](https://python-all.ru/3.13/glossary.html#term-iterator) для объекта. Его наличие обычно означает, что экземпляры этого типа являются [итерируемыми](https://python-all.ru/3.13/glossary.html#term-iterable) (хотя последовательности могут быть итерируемыми и без этой функции).11491150Эта функция имеет ту же сигнатуру, что и [`PyObject_GetIter()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetIter):11511152```c1153PyObject *tp_iter(PyObject *self);1154```11551156**Наследование:**11571158Это поле наследуется подтипами.11591160#### `iternextfunc PyTypeObject.tp_iternext`11611162*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_iternext` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*11631164Необязательный указатель на функцию, возвращающую следующий элемент [итератора](https://python-all.ru/3.13/glossary.html#term-iterator). Сигнатура:11651166```c1167PyObject *tp_iternext(PyObject *self);1168```11691170Когда итератор исчерпан, он должен возвращать `NULL`; исключение [`StopIteration`](https://python-all.ru/3.13/library/exceptions.html#StopIteration) может быть установлено или нет. При другой ошибке он также должен возвращать `NULL`. Его наличие означает, что экземпляры этого типа являются итераторами.11711172Типы-итераторы также должны определять функцию [`tp_iter`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_iter), и эта функция должна возвращать сам экземпляр итератора (не новый экземпляр итератора).11731174Эта функция имеет ту же сигнатуру, что и [`PyIter_Next()`](https://python-all.ru/3.13/c-api/iter.html#c.PyIter_Next).11751176**Наследование:**11771178Это поле наследуется подтипами.11791180#### `struct PyMethodDef *PyTypeObject.tp_methods`11811182*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_methods` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*11831184Необязательный указатель на статический массив структур [`PyMethodDef`](https://python-all.ru/3.13/c-api/structures.html#c.PyMethodDef), завершающийся `NULL`, объявляющий обычные методы этого типа.11851186Для каждой записи в массиве в словарь типа добавляется запись (см. [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict) ниже), содержащая дескриптор метода.11871188**Наследование:**11891190Это поле не наследуется подтипами (методы наследуются через другой механизм).11911192#### `struct PyMemberDef *PyTypeObject.tp_members`11931194*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_members` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*11951196Необязательный указатель на статический массив [`PyMemberDef`](https://python-all.ru/3.13/c-api/structures.html#c.PyMemberDef) структур, завершающийся `NULL`, объявляющий обычные элементы данных (поля или слоты) экземпляров этого типа.11971198Для каждой записи в массиве в словарь типа добавляется запись, содержащая дескриптор члена (см. [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict) ниже).11991200**Наследование:**12011202Это поле не наследуется подтипами (члены наследуются через другой механизм).12031204#### `struct PyGetSetDef *PyTypeObject.tp_getset`12051206*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_getset` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*12071208Необязательный указатель на статический массив [`PyGetSetDef`](https://python-all.ru/3.13/c-api/structures.html#c.PyGetSetDef) структур, завершающийся `NULL`, объявляющий вычисляемые атрибуты экземпляров этого типа.12091210Для каждой записи в массиве в словарь типа добавляется запись, содержащая дескриптор getset (см. [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict) ниже).12111212**Наследование:**12131214Это поле не наследуется подтипами (вычисляемые атрибуты наследуются через другой механизм).12151216#### `PyTypeObject *PyTypeObject.tp_base`12171218*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_base` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*12191220Необязательный указатель на базовый тип, от которого наследуются свойства типа. На этом уровне поддерживается только одиночное наследование; множественное наследование требует динамического создания объекта типа вызовом метатипа.12211222> **Примечание**1223>1224> Инициализация слотов подчиняется правилам инициализации глобальных переменных. C99 требует, чтобы инициализаторы были «адресными константами». Обозначения функций, такие как [`PyType_GenericNew()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GenericNew), с неявным преобразованием в указатель, являются допустимыми адресными константами C99.1225>1226> Однако унарный оператор '&', применённый к нестатической переменной, такой как [`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type), не обязан давать адресную константу. Компиляторы могут это поддерживать (gcc поддерживает), MSVC – нет. Оба компилятора в этом конкретном поведении строго соответствуют стандарту.1227>1228> Следовательно, [`tp_base`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_base) должно устанавливаться в функции инициализации модуля расширения.12291230**Наследование:**12311232Это поле не наследуется подтипами (очевидно).12331234**По умолчанию:**12351236По умолчанию это поле равно `&PyBaseObject_Type` (которое программистам Python известно как тип [`object`](https://python-all.ru/3.13/library/functions.html#object)).12371238#### `PyObject *PyTypeObject.tp_dict`12391240Словарь типа сохраняется здесь с помощью [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready).12411242Обычно это поле должно быть инициализировано значением `NULL` перед вызовом PyType\_Ready; оно также может быть инициализировано словарём, содержащим начальные атрибуты типа. После того как [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) инициализировал тип, в этот словарь можно добавлять дополнительные атрибуты только в том случае, если они не соответствуют перегруженным операциям (например, [`__add__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__add__)). После завершения инициализации типа это поле должно считаться доступным только для чтения.12431244Некоторые типы могут не хранить свой словарь в этом слоте. Используйте [`PyType_GetDict()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetDict) для получения словаря для произвольного типа.12451246Изменено в версии 3.12: Детали реализации: для статических встроенных типов это всегда `NULL`. Вместо этого словарь для таких типов хранится в `PyInterpreterState`. Используйте [`PyType_GetDict()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetDict) для получения словаря для произвольного типа.12471248**Наследование:**12491250Это поле не наследуется подтипами (хотя определённые здесь атрибуты наследуются через другой механизм).12511252**По умолчанию:**12531254Если это поле равно `NULL`, [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) назначит ему новый словарь.12551256> **Предупреждение**1257>1258> Небезопасно использовать [`PyDict_SetItem()`](https://python-all.ru/3.13/c-api/dict.html#c.PyDict_SetItem) на или иным образом изменять [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict) с помощью C-API словаря.12591260#### `descrgetfunc PyTypeObject.tp_descr_get`12611262*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_descr_get` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*12631264Необязательный указатель на функцию «descriptor get».12651266Сигнатура функции:12671268```c1269PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);1270```12711272**Наследование:**12731274Это поле наследуется подтипами.12751276#### `descrsetfunc PyTypeObject.tp_descr_set`12771278*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_descr_set` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*12791280Необязательный указатель на функцию для установки и удаления значения дескриптора.12811282Сигнатура функции:12831284```c1285int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);1286```12871288Аргумент *value* устанавливается в `NULL` для удаления значения.12891290**Наследование:**12911292Это поле наследуется подтипами.12931294#### `Py_ssize_t PyTypeObject.tp_dictoffset`12951296Хотя это поле всё ещё поддерживается, следует использовать [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) вместо него, если это возможно.12971298Если экземпляры этого типа имеют словарь, содержащий переменные экземпляра, это поле не равно нулю и содержит смещение в структуре экземпляра для словаря переменных экземпляра; это смещение используется [`PyObject_GenericGetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GenericGetAttr).12991300Не путайте это поле с [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict); это словарь для атрибутов самого объекта типа.13011302Значение задаёт смещение словаря относительно начала структуры экземпляра.13031304[`tp_dictoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) следует рассматривать как доступный только для записи. Чтобы получить указатель на словарь, вызовите [`PyObject_GenericGetDict()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GenericGetDict). Вызов `PyObject_GenericGetDict()` может потребовать выделения памяти для словаря, поэтому может быть эффективнее вызвать [`PyObject_GetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetAttr) при доступе к атрибуту объекта.13051306Установка обоих битов [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) и [`tp_dictoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) является ошибкой.13071308**Наследование:**13091310Это поле наследуется подтипами. Подтип не должен переопределять это смещение; это может быть небезопасно, если код C попытается получить доступ к словарю по предыдущему смещению. Для корректной поддержки наследования используйте [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT).13111312**По умолчанию:**13131314Этот слот не имеет значения по умолчанию. Для [статических типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types), если поле равно `NULL`, то для экземпляров не создаётся [`__dict__`](https://python-all.ru/3.13/reference/datamodel.html#object.__dict__).13151316Если в поле [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags) установлен бит [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT), то [`tp_dictoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) будет установлено в `-1`, чтобы указать, что использовать это поле небезопасно.13171318#### `initproc PyTypeObject.tp_init`13191320*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_init` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*13211322Необязательный указатель на функцию инициализации экземпляра.13231324Эта функция соответствует методу [`__init__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__init__) классов. Как и `__init__()`, можно создать экземпляр без вызова `__init__()`, и можно переинициализировать экземпляр, вызвав его метод `__init__()` ещё раз.13251326Сигнатура функции:13271328```c1329int tp_init(PyObject *self, PyObject *args, PyObject *kwds);1330```13311332Аргумент self – это инициализируемый экземпляр; аргументы *args* и *kwds* представляют позиционные и именованные аргументы вызова [`__init__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__init__).13331334Функция [`tp_init`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_init), если она не `NULL`, вызывается при обычном создании экземпляра через вызов его типа, после того как функция [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) типа вернула экземпляр этого типа. Если функция `tp_new` возвращает экземпляр другого типа, не являющегося подтипом исходного, функция `tp_init` не вызывается; если `tp_new` возвращает экземпляр подтипа исходного типа, вызывается `tp_init` подтипа.13351336Возвращает `0` при успехе, `-1` и устанавливает исключение при ошибке.13371338**Наследование:**13391340Это поле наследуется подтипами.13411342**По умолчанию:**13431344Для [статических типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types) это поле не имеет значения по умолчанию.13451346#### `allocfunc PyTypeObject.tp_alloc`13471348*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_alloc` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*13491350Необязательный указатель на функцию выделения экземпляра.13511352Сигнатура функции:13531354```c1355PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);1356```13571358**Наследование:**13591360Это поле наследуется статическими подтипами, но не динамическими подтипами (подтипами, созданными с помощью инструкции class).13611362**По умолчанию:**13631364Для динамических подтипов это поле всегда устанавливается в [`PyType_GenericAlloc()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GenericAlloc), чтобы принудительно применять стандартную стратегию выделения памяти из кучи.13651366Для статических подтипов [`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) использует [`PyType_GenericAlloc()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GenericAlloc). Это рекомендуемое значение для всех статически определённых типов.13671368#### `newfunc PyTypeObject.tp_new`13691370*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_new` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*13711372Необязательный указатель на функцию создания экземпляра.13731374Сигнатура функции:13751376```c1377PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);1378```13791380Аргумент *subtype* – это тип создаваемого объекта; аргументы *args* и *kwds* представляют позиционные и ключевые аргументы вызова типа. Обратите внимание, что *subtype* не обязан совпадать с типом, чья функция [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) вызывается; это может быть подтип этого типа (но не произвольный тип).13811382Функция [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) должна вызывать `subtype->tp_alloc(subtype, nitems)` для выделения памяти под объект, а затем выполнять лишь минимально необходимую инициализацию. Инициализацию, которую можно безопасно пропустить или повторить, следует помещать в обработчик [`tp_init`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_init). Хорошее эмпирическое правило: для неизменяемых типов вся инициализация должна выполняться в `tp_new`, а для изменяемых типов большую часть инициализации лучше отложить до `tp_init`.13831384Флаг [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION) используется для запрета создания экземпляров типа в Python.13851386**Наследование:**13871388Это поле наследуется подтипами, за исключением [статических типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types), у которых [`tp_base`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_base) равно `NULL` или `&PyBaseObject_Type`.13891390**По умолчанию:**13911392Для [статических типов](https://python-all.ru/3.13/c-api/typeobj.html#static-types) это поле не имеет значения по умолчанию. Это означает, что если слот определён как `NULL`, тип нельзя вызвать для создания новых экземпляров; предположительно, существует другой способ создания экземпляров, например фабричная функция.13931394#### `freefunc PyTypeObject.tp_free`13951396*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_free` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*13971398Необязательный указатель на функцию освобождения экземпляра. Её сигнатура:13991400```c1401void tp_free(void *self);1402```14031404Инициализатор, совместимый с этой сигнатурой: [`PyObject_Free()`](https://python-all.ru/3.13/c-api/memory.html#c.PyObject_Free).14051406**Наследование:**14071408Это поле наследуется статическими подтипами, но не динамическими подтипами (подтипами, созданными через объявление класса).14091410**По умолчанию:**14111412В динамических подтипах это поле устанавливается в деаллокатор, подходящий для соответствия [`PyType_GenericAlloc()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GenericAlloc) и значению флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).14131414Для статических подтипов [`PyBaseObject_Type`](https://python-all.ru/3.13/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_Del()`](https://python-all.ru/3.13/c-api/allocation.html#c.PyObject_Del).14151416#### `inquiry PyTypeObject.tp_is_gc`14171418*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_is_gc` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*14191420Необязательный указатель на функцию, вызываемую сборщиком мусора.14211422Сборщику мусора необходимо знать, можно ли собрать конкретный объект или нет. Обычно достаточно посмотреть на поле [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags) типа объекта и проверить бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC). Но некоторые типы содержат как статически, так и динамически выделенные экземпляры, и статически выделенные экземпляры не подлежат сборке. Такие типы должны определять эту функцию; она должна возвращать `1` для собираемого экземпляра и `0` для несобираемого. Сигнатура:14231424```c1425int tp_is_gc(PyObject *self);1426```14271428(Единственный пример этого – сами типы. Метакласс, [`PyType_Type`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Type), определяет эту функцию, чтобы различать статически и [динамически выделенные типы](https://python-all.ru/3.13/c-api/typeobj.html#heap-types).)14291430**Наследование:**14311432Это поле наследуется подтипами.14331434**По умолчанию:**14351436У этого слота нет значения по умолчанию. Если это поле равно `NULL`, то в качестве функционального эквивалента используется [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).14371438#### `PyObject *PyTypeObject.tp_bases`14391440*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_bases` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*14411442Кортеж базовых типов.14431444Это поле должно быть установлено в `NULL` и считаться доступным только для чтения. Python заполнит его, когда тип будет [`initialized`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready).14451446Для динамически создаваемых классов вместо аргумента *bases* из [`PyType_FromSpecWithBases()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpecWithBases) можно использовать `Py_tp_bases` [`slot`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot). Предпочтительна форма с аргументом.14471448> **Предупреждение**1449>1450> Множественное наследование плохо работает для статически определённых типов. Если установить `tp_bases` в кортеж, Python не вызовет ошибку, но некоторые слоты будут унаследованы только от первого базового класса.14511452**Наследование:**14531454Это поле не наследуется.14551456#### `PyObject *PyTypeObject.tp_mro`14571458Кортеж, содержащий расширенный набор базовых типов, начиная с самого типа и заканчивая [`object`](https://python-all.ru/3.13/library/functions.html#object), в порядке разрешения методов (MRO).14591460Это поле должно быть установлено в `NULL` и считаться доступным только для чтения. Python заполнит его, когда тип будет [`initialized`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready).14611462**Наследование:**14631464Это поле не наследуется; оно вычисляется заново с помощью [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready).14651466#### `PyObject *PyTypeObject.tp_cache`14671468Не используется. Только для внутреннего использования.14691470**Наследование:**14711472Это поле не наследуется.14731474#### `void *PyTypeObject.tp_subclasses`14751476Коллекция подклассов. Только для внутреннего использования. Может быть недопустимым указателем.14771478Чтобы получить список подклассов, вызовите метод Python [`__subclasses__()`](https://python-all.ru/3.13/reference/datamodel.html#type.__subclasses__).14791480Изменено в версии 3.12: Для некоторых типов это поле не содержит допустимый [PyObject](https://python-all.ru/3.13/c-api/structures.html#c.PyObject)\*. Тип был изменён на void\*, чтобы указать на это.14811482**Наследование:**14831484Это поле не наследуется.14851486#### `PyObject *PyTypeObject.tp_weaklist`14871488Голова списка слабых ссылок для слабых ссылок на этот объект типа. Не наследуется. Только для внутреннего использования.14891490Изменено в версии 3.12: Деталь внутренней реализации: для статических встроенных типов это всегда `NULL`, даже если добавлены слабые ссылки. Вместо этого слабые ссылки для каждого хранятся в `PyInterpreterState`. Используйте публичный C-API или внутренний макрос `_PyObject_GET_WEAKREFS_LISTPTR()`, чтобы избежать этого различия.14911492**Наследование:**14931494Это поле не наследуется.14951496#### `destructor PyTypeObject.tp_del`14971498*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_del` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*14991500Это поле устарело. Используйте [`tp_finalize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_finalize) вместо него.15011502#### `unsigned int PyTypeObject.tp_version_tag`15031504Используется для индексации кэша методов. Только для внутреннего использования.15051506**Наследование:**15071508Это поле не наследуется.15091510#### `destructor PyTypeObject.tp_finalize`15111512*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_tp_finalize` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*15131514Необязательный указатель на функцию финализации экземпляра. Это C-реализация специального метода [`__del__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__del__). Его сигнатура:15151516```c1517void tp_finalize(PyObject *self);1518```15191520Если [`tp_finalize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_finalize) установлен, интерпретатор вызывает его один раз при финализации экземпляра. Он вызывается либо сборщиком мусора (если экземпляр является частью изолированного цикла ссылок), либо непосредственно перед освобождением объекта. В любом случае гарантируется, что он будет вызван до попытки разорвать циклы ссылок, что обеспечивает нахождение объекта в корректном состоянии.15211522[`tp_finalize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_finalize) не должен изменять текущий статус исключения; поэтому рекомендуемый способ написания нетривиального финализатора:15231524```c1525static void1526local_finalize(PyObject *self)1527{1528    /* Сохранить текущее исключение, если оно есть. */1529    PyObject *exc = PyErr_GetRaisedException();15301531    /* ... */15321533    /* Восстановить сохранённое исключение. */1534    PyErr_SetRaisedException(exc);1535}1536```15371538**Наследование:**15391540Это поле наследуется подтипами.15411542Добавлено в версии 3.4.15431544Изменено в версии 3.8: До версии 3.8 необходимо было установить бит флагов [`Py_TPFLAGS_HAVE_FINALIZE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_FINALIZE), чтобы это поле можно было использовать. Теперь это не требуется.15451546> **См. также**1547>1548> «Безопасная финализация объектов» ([**PEP 442**](https://python-all.ru/3.13/c-api/typeobj.html))15491550#### `vectorcallfunc PyTypeObject.tp_vectorcall`15511552Функция vectorcall, используемая для вызовов этого объекта типа. Другими словами, она используется для реализации [vectorcall](https://python-all.ru/3.13/c-api/call.html#vectorcall) для `type.__call__`. Если `tp_vectorcall` равно `NULL`, используется реализация вызова по умолчанию с использованием [`__new__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__new__) и [`__init__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__init__).15531554**Наследование:**15551556Это поле никогда не наследуется.15571558Добавлено в версии 3.9: (поле существует с версии 3.8, но используется только с версии 3.9)15591560#### `unsigned char PyTypeObject.tp_watched`15611562Внутреннее. Не использовать.15631564Добавлено в версии 3.12.15651566## Статические типы15671568Традиционно типы, определяемые в коде C, являются *статическими*, то есть статическая структура [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) определяется непосредственно в коде и инициализируется с помощью [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready).15691570В результате получаются типы, которые ограничены по сравнению с типами, определёнными в Python.15711572- Статические типы ограничены одним базовым классом, то есть не могут использовать множественное наследование.1573- Объекты статических типов (но не обязательно их экземпляры) неизменяемы. Из Python невозможно добавить или изменить атрибуты объекта типа.1574- Объекты статических типов разделяются между [под-интерпретаторами](https://python-all.ru/3.13/c-api/init.html#sub-interpreter-support), поэтому они не должны содержать состояние, специфичное для под-интерпретатора.15751576Кроме того, поскольку [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject) является лишь частью [Limited API](https://python-all.ru/3.13/c-api/stable.html#limited-c-api) в виде непрозрачной структуры, любые модули расширения, использующие статические типы, должны быть скомпилированы для конкретной минорной версии Python.15771578## Кучные типы15791580Альтернативой [статическим типам](https://python-all.ru/3.13/c-api/typeobj.html#static-types) являются *кучные типы (heap-allocated types)*, или *кучные типы (heap types)* для краткости. Они очень похожи на классы, создаваемые с помощью оператора `class`. У кучных типов установлен флаг [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE).15811582Для этого заполняется структура [`PyType_Spec`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Spec) и вызывается [`PyType_FromSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpec), [`PyType_FromSpecWithBases()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpecWithBases), [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromModuleAndSpec) или [`PyType_FromMetaclass()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromMetaclass).15831584## Структуры числовых объектов15851586#### `type PyNumberMethods`15871588Эта структура содержит указатели на функции, которые объект использует для реализации числового протокола. Каждая функция используется одноимённой функцией, описанной в разделе [Числовой протокол](https://python-all.ru/3.13/c-api/number.html#number).15891590Вот определение структуры:15911592```c1593typedef struct {1594     binaryfunc nb_add;1595     binaryfunc nb_subtract;1596     binaryfunc nb_multiply;1597     binaryfunc nb_remainder;1598     binaryfunc nb_divmod;1599     ternaryfunc nb_power;1600     unaryfunc nb_negative;1601     unaryfunc nb_positive;1602     unaryfunc nb_absolute;1603     inquiry nb_bool;1604     unaryfunc nb_invert;1605     binaryfunc nb_lshift;1606     binaryfunc nb_rshift;1607     binaryfunc nb_and;1608     binaryfunc nb_xor;1609     binaryfunc nb_or;1610     unaryfunc nb_int;1611     void *nb_reserved;1612     unaryfunc nb_float;16131614     binaryfunc nb_inplace_add;1615     binaryfunc nb_inplace_subtract;1616     binaryfunc nb_inplace_multiply;1617     binaryfunc nb_inplace_remainder;1618     ternaryfunc nb_inplace_power;1619     binaryfunc nb_inplace_lshift;1620     binaryfunc nb_inplace_rshift;1621     binaryfunc nb_inplace_and;1622     binaryfunc nb_inplace_xor;1623     binaryfunc nb_inplace_or;16241625     binaryfunc nb_floor_divide;1626     binaryfunc nb_true_divide;1627     binaryfunc nb_inplace_floor_divide;1628     binaryfunc nb_inplace_true_divide;16291630     unaryfunc nb_index;16311632     binaryfunc nb_matrix_multiply;1633     binaryfunc nb_inplace_matrix_multiply;1634} PyNumberMethods;1635```16361637> **Примечание**1638>1639> Бинарные и тернарные функции должны проверять тип всех своих операндов и выполнять необходимые преобразования (хотя бы один из операндов должен быть экземпляром определяемого типа). Если операция не определена для данных операндов, бинарные и тернарные функции должны вернуть `Py_NotImplemented`; если произошла другая ошибка, они должны вернуть `NULL` и установить исключение.16401641> **Примечание**1642>1643> Поле [`nb_reserved`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_reserved) всегда должно быть `NULL`. Ранее оно называлось `nb_long` и было переименовано в Python 3.0.1.16441645#### `binaryfunc PyNumberMethods.nb_add`16461647*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_add` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16481649#### `binaryfunc PyNumberMethods.nb_subtract`16501651*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_subtract` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16521653#### `binaryfunc PyNumberMethods.nb_multiply`16541655*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_multiply` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16561657#### `binaryfunc PyNumberMethods.nb_remainder`16581659*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_remainder` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16601661#### `binaryfunc PyNumberMethods.nb_divmod`16621663*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_divmod` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16641665#### `ternaryfunc PyNumberMethods.nb_power`16661667*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_power` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16681669#### `unaryfunc PyNumberMethods.nb_negative`16701671*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_negative` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16721673#### `unaryfunc PyNumberMethods.nb_positive`16741675*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_positive` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16761677#### `unaryfunc PyNumberMethods.nb_absolute`16781679*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_absolute` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16801681#### `inquiry PyNumberMethods.nb_bool`16821683*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_bool` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16841685#### `unaryfunc PyNumberMethods.nb_invert`16861687*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_invert` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16881689#### `binaryfunc PyNumberMethods.nb_lshift`16901691*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_lshift` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16921693#### `binaryfunc PyNumberMethods.nb_rshift`16941695*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_rshift` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*16961697#### `binaryfunc PyNumberMethods.nb_and`16981699*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_and` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17001701#### `binaryfunc PyNumberMethods.nb_xor`17021703*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_xor` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17041705#### `binaryfunc PyNumberMethods.nb_or`17061707*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_or` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17081709#### `unaryfunc PyNumberMethods.nb_int`17101711*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_int` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17121713#### `void *PyNumberMethods.nb_reserved`17141715#### `unaryfunc PyNumberMethods.nb_float`17161717*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_float` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17181719#### `binaryfunc PyNumberMethods.nb_inplace_add`17201721*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_add` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17221723#### `binaryfunc PyNumberMethods.nb_inplace_subtract`17241725*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_subtract` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17261727#### `binaryfunc PyNumberMethods.nb_inplace_multiply`17281729*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_multiply` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17301731#### `binaryfunc PyNumberMethods.nb_inplace_remainder`17321733*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_remainder` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17341735#### `ternaryfunc PyNumberMethods.nb_inplace_power`17361737*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_power` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17381739#### `binaryfunc PyNumberMethods.nb_inplace_lshift`17401741*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_lshift` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17421743#### `binaryfunc PyNumberMethods.nb_inplace_rshift`17441745*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_rshift` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17461747#### `binaryfunc PyNumberMethods.nb_inplace_and`17481749*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_and` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17501751#### `binaryfunc PyNumberMethods.nb_inplace_xor`17521753*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_xor` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17541755#### `binaryfunc PyNumberMethods.nb_inplace_or`17561757*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_or` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17581759#### `binaryfunc PyNumberMethods.nb_floor_divide`17601761*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_floor_divide` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17621763#### `binaryfunc PyNumberMethods.nb_true_divide`17641765*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_true_divide` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17661767#### `binaryfunc PyNumberMethods.nb_inplace_floor_divide`17681769*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_floor_divide` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17701771#### `binaryfunc PyNumberMethods.nb_inplace_true_divide`17721773*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_true_divide` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17741775#### `unaryfunc PyNumberMethods.nb_index`17761777*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_index` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17781779#### `binaryfunc PyNumberMethods.nb_matrix_multiply`17801781*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_matrix_multiply` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*17821783#### `binaryfunc PyNumberMethods.nb_inplace_matrix_multiply`17841785*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_matrix_multiply` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*17861787## Структуры объектов отображения17881789#### `type PyMappingMethods`17901791Эта структура хранит указатели на функции, которые объект использует для реализации протокола отображения. Она содержит три члена:17921793#### `lenfunc PyMappingMethods.mp_length`17941795*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_mp_length` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*17961797Эта функция используется [`PyMapping_Size()`](https://python-all.ru/3.13/c-api/mapping.html#c.PyMapping_Size) и [`PyObject_Size()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Size) и имеет ту же сигнатуру. Этот слот может быть установлен в `NULL`, если у объекта нет определённой длины.17981799#### `binaryfunc PyMappingMethods.mp_subscript`18001801*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_mp_subscript` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18021803Эта функция используется [`PyObject_GetItem()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetItem) и [`PySequence_GetSlice()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_GetSlice) и имеет ту же сигнатуру, что и `PyObject_GetItem()`. Этот слот должен быть заполнен, чтобы функция [`PyMapping_Check()`](https://python-all.ru/3.13/c-api/mapping.html#c.PyMapping_Check) возвращала `1`; в противном случае он может быть `NULL` .18041805#### `objobjargproc PyMappingMethods.mp_ass_subscript`18061807*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_mp_ass_subscript` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18081809Эта функция используется [`PyObject_SetItem()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_SetItem), [`PyObject_DelItem()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_DelItem), [`PySequence_SetSlice()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_SetSlice) и [`PySequence_DelSlice()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_DelSlice). У неё та же сигнатура, что и у `PyObject_SetItem()`, но *v* также может быть установлен в `NULL` для удаления элемента. Если этот слот равен `NULL`, объект не поддерживает присваивание и удаление элементов.18101811## Структуры объектов последовательностей18121813#### `type PySequenceMethods`18141815Эта структура содержит указатели на функции, которые объект использует для реализации протокола последовательности.18161817#### `lenfunc PySequenceMethods.sq_length`18181819*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_length` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18201821Эта функция используется [`PySequence_Size()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Size) и [`PyObject_Size()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_Size) и имеет ту же сигнатуру. Она также используется для обработки отрицательных индексов через слоты [`sq_item`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_item) и [`sq_ass_item`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_ass_item).18221823#### `binaryfunc PySequenceMethods.sq_concat`18241825*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_concat` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18261827Эта функция используется [`PySequence_Concat()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Concat) и имеет ту же сигнатуру. Она также используется оператором `+` после попытки численного сложения через слот [`nb_add`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_add).18281829#### `ssizeargfunc PySequenceMethods.sq_repeat`18301831*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_repeat` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18321833Эта функция используется [`PySequence_Repeat()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Repeat) и имеет ту же сигнатуру. Она также используется оператором `*` после попытки численного умножения через слот [`nb_multiply`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_multiply).18341835#### `ssizeargfunc PySequenceMethods.sq_item`18361837*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_item` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18381839Эта функция используется [`PySequence_GetItem()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_GetItem) и имеет ту же сигнатуру. Она также используется [`PyObject_GetItem()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetItem) после попытки индексирования через слот [`mp_subscript`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods.mp_subscript). Этот слот должен быть заполнен, чтобы функция [`PySequence_Check()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Check) возвращала `1`; в противном случае он может быть `NULL`.18401841Отрицательные индексы обрабатываются следующим образом: если слот [`sq_length`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_length) заполнен, он вызывается, и длина последовательности используется для вычисления положительного индекса, который передаётся [`sq_item`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_item). Если `sq_length` равно `NULL`, индекс передаётся функции как есть.18421843#### `ssizeobjargproc PySequenceMethods.sq_ass_item`18441845*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_ass_item` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18461847Эта функция используется [`PySequence_SetItem()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_SetItem) и имеет ту же сигнатуру. Она также используется [`PyObject_SetItem()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_SetItem) и [`PyObject_DelItem()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_DelItem) после попытки присваивания и удаления элемента через слот [`mp_ass_subscript`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods.mp_ass_subscript). Этот слот может быть оставлен равным `NULL`, если объект не поддерживает присваивание и удаление элементов.18481849#### `objobjproc PySequenceMethods.sq_contains`18501851*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_contains` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18521853Эта функция может использоваться [`PySequence_Contains()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Contains) и имеет ту же сигнатуру. Этот слот может быть оставлен равным `NULL`; в этом случае `PySequence_Contains()` просто проходит по последовательности, пока не найдёт совпадение.18541855#### `binaryfunc PySequenceMethods.sq_inplace_concat`18561857*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_inplace_concat` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18581859Эта функция используется [`PySequence_InPlaceConcat()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_InPlaceConcat) и имеет ту же сигнатуру. Она должна изменить свой первый операнд и вернуть его. Этот слот может быть оставлен равным `NULL`; в этом случае `PySequence_InPlaceConcat()` будет использовать [`PySequence_Concat()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Concat) как запасной вариант. Она также используется расширенным присваиванием `+=` после попытки численного сложения на месте через слот [`nb_inplace_add`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_add).18601861#### `ssizeargfunc PySequenceMethods.sq_inplace_repeat`18621863*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_sq_inplace_repeat` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*18641865Эта функция используется [`PySequence_InPlaceRepeat()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_InPlaceRepeat) и имеет ту же сигнатуру. Она должна изменить свой первый операнд и вернуть его. Этот слот может быть оставлен равным `NULL`; в этом случае `PySequence_InPlaceRepeat()` будет использовать [`PySequence_Repeat()`](https://python-all.ru/3.13/c-api/sequence.html#c.PySequence_Repeat) как запасной вариант. Она также используется расширенным присваиванием `*=` после попытки численного умножения на месте через слот [`nb_inplace_multiply`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_multiply).18661867## Структуры объектов буфера18681869#### `type PyBufferProcs`18701871Эта структура содержит указатели на функции, необходимые для [протокола буфера](https://python-all.ru/3.13/c-api/buffer.html#bufferobjects). Протокол определяет, как объект-экспортёр может предоставлять свои внутренние данные объектам-потребителям.18721873#### `getbufferproc PyBufferProcs.bf_getbuffer`18741875*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_bf_getbuffer` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.*18761877Сигнатура этой функции:18781879```c1880int (PyObject *exporter, Py_buffer *view, int flags);1881```18821883Обрабатывает запрос к *экспортёру* на заполнение *представления* в соответствии с *флагами*. За исключением пункта (3), реализация этой функции ОБЯЗАНА выполнить следующие шаги:188418851. Проверить, можно ли удовлетворить запрос. Если нет, возбудить [`BufferError`](https://python-all.ru/3.13/library/exceptions.html#BufferError), установить `view->obj` в `NULL` и вернуть `-1`.18862. Заполнить запрошенные поля.18873. Увеличить внутренний счётчик числа экспортов.18884. Установить `view->obj` в *экспортёр* и увеличить `view->obj`.18895. Вернуть `0`.18901891Если *экспортёр* является частью цепочки или дерева поставщиков буферов, можно использовать две основные схемы:18921893- Повторный экспорт: каждый элемент дерева выступает в роли экспортирующего объекта и устанавливает `view->obj` в новую ссылку на себя.1894- Перенаправление: запрос буфера перенаправляется корневому объекту дерева. Здесь `view->obj` будет новой ссылкой на корневой объект.18951896Отдельные поля *представления* описаны в разделе [Структура буфера](https://python-all.ru/3.13/c-api/buffer.html#buffer-structure), правила, как экспортёр должен реагировать на конкретные запросы – в разделе [Типы запросов буфера](https://python-all.ru/3.13/c-api/buffer.html#buffer-request-types).18971898Вся память, на которую указывает структура [`Py_buffer`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer), принадлежит экспортёру и должна оставаться действительной, пока есть хотя бы один потребитель. [`format`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer.format), [`shape`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer.shape), [`strides`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer.strides), [`suboffsets`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer.suboffsets) и [`internal`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer.internal) доступны потребителю только для чтения.18991900[`PyBuffer_FillInfo()`](https://python-all.ru/3.13/c-api/buffer.html#c.PyBuffer_FillInfo) предоставляет простой способ предоставления простого байтового буфера, корректно обрабатывая все типы запросов.19011902[`PyObject_GetBuffer()`](https://python-all.ru/3.13/c-api/buffer.html#c.PyObject_GetBuffer) – это интерфейс для потребителя, который оборачивает эту функцию.19031904#### `releasebufferproc PyBufferProcs.bf_releasebuffer`19051906*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_bf_releasebuffer` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.*19071908Сигнатура этой функции:19091910```c1911void (PyObject *exporter, Py_buffer *view);1912```19131914Обрабатывает запрос на освобождение ресурсов буфера. Если никакие ресурсы освобождать не нужно, [`PyBufferProcs.bf_releasebuffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) может быть `NULL`. В противном случае стандартная реализация этой функции выполнит следующие необязательные шаги:191519161. Уменьшить внутренний счётчик числа экспортов.19172. Если счётчик равен `0`, освободить всю память, связанную с *представлением*.19181919Экспортёр ОБЯЗАН использовать поле [`internal`](https://python-all.ru/3.13/c-api/buffer.html#c.Py_buffer.internal) для отслеживания ресурсов, специфичных для буфера. Гарантируется, что это поле остаётся постоянным, в то время как потребитель МОЖЕТ передавать копию исходного буфера в качестве аргумента *view*.19201921Эта функция НЕ ДОЛЖНА уменьшать `view->obj`, так как это делается автоматически в [`PyBuffer_Release()`](https://python-all.ru/3.13/c-api/buffer.html#c.PyBuffer_Release) (такая схема полезна для разрыва циклических ссылок).19221923[`PyBuffer_Release()`](https://python-all.ru/3.13/c-api/buffer.html#c.PyBuffer_Release) – это интерфейс для потребителя, который оборачивает эту функцию.19241925## Асинхронные структуры объектов19261927Добавлено в версии 3.5.19281929#### `type PyAsyncMethods`19301931Эта структура содержит указатели на функции, необходимые для реализации объектов [ожидаемый объект](https://python-all.ru/3.13/glossary.html#term-awaitable) и [асинхронный итератор](https://python-all.ru/3.13/glossary.html#term-asynchronous-iterator).19321933Вот определение структуры:19341935```c1936typedef struct {1937    unaryfunc am_await;1938    unaryfunc am_aiter;1939    unaryfunc am_anext;1940    sendfunc am_send;1941} PyAsyncMethods;1942```19431944#### `unaryfunc PyAsyncMethods.am_await`19451946*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_am_await` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*19471948Сигнатура этой функции:19491950```c1951PyObject *am_await(PyObject *self);1952```19531954Возвращаемый объект должен быть [итератором](https://python-all.ru/3.13/glossary.html#term-iterator), т.е. [`PyIter_Check()`](https://python-all.ru/3.13/c-api/iter.html#c.PyIter_Check) должен возвращать `1` для него.19551956Этот слот может быть установлен в `NULL`, если объект не является [ожидаемым объектом](https://python-all.ru/3.13/glossary.html#term-awaitable).19571958#### `unaryfunc PyAsyncMethods.am_aiter`19591960*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_am_aiter` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*19611962Сигнатура этой функции:19631964```c1965PyObject *am_aiter(PyObject *self);1966```19671968Должен возвращать объект [асинхронный итератор](https://python-all.ru/3.13/glossary.html#term-asynchronous-iterator). Подробнее см. [`__anext__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__anext__).19691970Этот слот может быть установлен в `NULL`, если объект не реализует протокол асинхронной итерации.19711972#### `unaryfunc PyAsyncMethods.am_anext`19731974*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_am_anext` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.5.*19751976Сигнатура этой функции:19771978```c1979PyObject *am_anext(PyObject *self);1980```19811982Должен возвращать объект [ожидаемый объект](https://python-all.ru/3.13/glossary.html#term-awaitable). Подробнее см. [`__anext__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__anext__). Этот слот может быть установлен в `NULL`.19831984#### `sendfunc PyAsyncMethods.am_send`19851986*Соответствующий [идентификатор слота](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot) `Py_am_send` является частью [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.10.*19871988Сигнатура этой функции:19891990```c1991PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);1992```19931994Подробнее см. [`PyIter_Send()`](https://python-all.ru/3.13/c-api/iter.html#c.PyIter_Send). Этот слот может быть установлен в `NULL`.19951996Добавлено в версии 3.10.19971998## Определения типов слотов19992000#### `typedef PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems)`20012002*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20032004Назначение этой функции – разделить выделение памяти и её инициализацию. Она должна возвращать указатель на блок памяти достаточной длины для экземпляра, с подходящим выравниванием и обнулённый, но с [`ob_refcnt`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_refcnt), установленным в `1`, и [`ob_type`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_type), установленным в аргумент типа. Если [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) типа не равно нулю, поле [`ob_size`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyVarObject.ob_size) объекта должно быть инициализировано значением *nitems*, а длина выделенного блока памяти должна быть `tp_basicsize + nitems*tp_itemsize`, округлённой до кратного `sizeof(void*)`; в противном случае *nitems* не используется, и длина блока должна быть [`tp_basicsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).20052006Эта функция не должна выполнять никакой другой инициализации экземпляра, включая выделение дополнительной памяти; это должно выполнять [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new).20072008#### `typedef void (*destructor)(PyObject*)`20092010*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20112012#### `typedef void (*freefunc)(void*)`20132014См. [`tp_free`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_free).20152016#### `typedef PyObject *(*newfunc)(PyTypeObject*, PyObject*, PyObject*)`20172018*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20192020См. [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new).20212022#### `typedef int (*initproc)(PyObject*, PyObject*, PyObject*)`20232024*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20252026См. [`tp_init`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_init).20272028#### `typedef PyObject *(*reprfunc)(PyObject*)`20292030*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20312032См. [`tp_repr`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_repr).20332034#### `typedef PyObject *(*getattrfunc)(PyObject *self, char *attr)`20352036*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20372038Возвращает значение именованного атрибута для объекта.20392040#### `typedef int (*setattrfunc)(PyObject *self, char *attr, PyObject *value)`20412042*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20432044Устанавливает значение именованного атрибута для объекта. Аргумент value устанавливается в `NULL` для удаления атрибута.20452046#### `typedef PyObject *(*getattrofunc)(PyObject *self, PyObject *attr)`20472048*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20492050Возвращает значение именованного атрибута для объекта.20512052См. [`tp_getattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_getattro).20532054#### `typedef int (*setattrofunc)(PyObject *self, PyObject *attr, PyObject *value)`20552056*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20572058Устанавливает значение именованного атрибута для объекта. Аргумент value устанавливается в `NULL` для удаления атрибута.20592060См. [`tp_setattro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_setattro).20612062#### `typedef PyObject *(*descrgetfunc)(PyObject*, PyObject*, PyObject*)`20632064*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20652066См. [`tp_descr_get`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_descr_get).20672068#### `typedef int (*descrsetfunc)(PyObject*, PyObject*, PyObject*)`20692070*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20712072См. [`tp_descr_set`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_descr_set).20732074#### `typedef Py_hash_t (*hashfunc)(PyObject*)`20752076*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20772078См. [`tp_hash`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_hash).20792080#### `typedef PyObject *(*richcmpfunc)(PyObject*, PyObject*, int)`20812082*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20832084См. [`tp_richcompare`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_richcompare).20852086#### `typedef PyObject *(*getiterfunc)(PyObject*)`20872088*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20892090См. [`tp_iter`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_iter).20912092#### `typedef PyObject *(*iternextfunc)(PyObject*)`20932094*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*20952096См. [`tp_iternext`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_iternext).20972098#### `typedef Py_ssize_t (*lenfunc)(PyObject*)`20992100*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21012102#### `typedef int (*getbufferproc)(PyObject*, Py_buffer*, int)`21032104*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*21052106#### `typedef void (*releasebufferproc)(PyObject*, Py_buffer*)`21072108*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*21092110#### `typedef PyObject *(*unaryfunc)(PyObject*)`21112112*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21132114#### `typedef PyObject *(*binaryfunc)(PyObject*, PyObject*)`21152116*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21172118#### `typedef PySendResult (*sendfunc)(PyObject*, PyObject*, PyObject**)`21192120См. [`am_send`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods.am_send).21212122#### `typedef PyObject *(*ternaryfunc)(PyObject*, PyObject*, PyObject*)`21232124*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21252126#### `typedef PyObject *(*ssizeargfunc)(PyObject*, Py_ssize_t)`21272128*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21292130#### `typedef int (*ssizeobjargproc)(PyObject*, Py_ssize_t, PyObject*)`21312132*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21332134#### `typedef int (*objobjproc)(PyObject*, PyObject*)`21352136*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21372138#### `typedef int (*objobjargproc)(PyObject*, PyObject*, PyObject*)`21392140*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*21412142## Примеры21432144Ниже приведены простые примеры определений типов Python. Они включают распространённые варианты использования, с которыми можно столкнуться. Некоторые демонстрируют сложные граничные случаи. За дополнительными примерами, практической информацией и учебным пособием обращайтесь к [Defining Extension Types: Tutorial](https://python-all.ru/3.13/extending/newtypes_tutorial.html#defining-new-types) и [Defining Extension Types: Assorted Topics](https://python-all.ru/3.13/extending/newtypes.html#new-types-topics).21452146Базовый [статический тип](https://python-all.ru/3.13/c-api/typeobj.html#static-types):21472148```c2149typedef struct {2150    PyObject_HEAD2151    const char *data;2152} MyObject;21532154static PyTypeObject MyObject_Type = {2155    PyVarObject_HEAD_INIT(NULL, 0)2156    .tp_name = "mymod.MyObject",2157    .tp_basicsize = sizeof(MyObject),2158    .tp_doc = PyDoc_STR("My objects"),2159    .tp_new = myobj_new,2160    .tp_dealloc = (destructor)myobj_dealloc,2161    .tp_repr = (reprfunc)myobj_repr,2162};2163```21642165Также можно встретить старый код (особенно в кодовой базе CPython) с более многословным инициализатором:21662167```c2168static PyTypeObject MyObject_Type = {2169    PyVarObject_HEAD_INIT(NULL, 0)2170    "mymod.MyObject",               /* tp_name */2171    sizeof(MyObject),               /* tp_basicsize */2172    0,                              /* tp_itemsize */2173    (destructor)myobj_dealloc,      /* tp_dealloc */2174    0,                              /* tp_vectorcall_offset */2175    0,                              /* tp_getattr */2176    0,                              /* tp_setattr */2177    0,                              /* tp_as_async */2178    (reprfunc)myobj_repr,           /* tp_repr */2179    0,                              /* tp_as_number */2180    0,                              /* tp_as_sequence */2181    0,                              /* tp_as_mapping */2182    0,                              /* tp_hash */2183    0,                              /* tp_call */2184    0,                              /* tp_str */2185    0,                              /* tp_getattro */2186    0,                              /* tp_setattro */2187    0,                              /* tp_as_buffer */2188    0,                              /* tp_flags */2189    PyDoc_STR("My objects"),        /* tp_doc */2190    0,                              /* tp_traverse */2191    0,                              /* tp_clear */2192    0,                              /* tp_richcompare */2193    0,                              /* tp_weaklistoffset */2194    0,                              /* tp_iter */2195    0,                              /* tp_iternext */2196    0,                              /* tp_methods */2197    0,                              /* tp_members */2198    0,                              /* tp_getset */2199    0,                              /* tp_base */2200    0,                              /* tp_dict */2201    0,                              /* tp_descr_get */2202    0,                              /* tp_descr_set */2203    0,                              /* tp_dictoffset */2204    0,                              /* tp_init */2205    0,                              /* tp_alloc */2206    myobj_new,                      /* tp_new */2207};2208```22092210Тип, поддерживающий слабые ссылки, словари экземпляров и хеширование:22112212```c2213typedef struct {2214    PyObject_HEAD2215    const char *data;2216} MyObject;22172218static PyTypeObject MyObject_Type = {2219    PyVarObject_HEAD_INIT(NULL, 0)2220    .tp_name = "mymod.MyObject",2221    .tp_basicsize = sizeof(MyObject),2222    .tp_doc = PyDoc_STR("My objects"),2223    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |2224         Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |2225         Py_TPFLAGS_MANAGED_WEAKREF,2226    .tp_new = myobj_new,2227    .tp_traverse = (traverseproc)myobj_traverse,2228    .tp_clear = (inquiry)myobj_clear,2229    .tp_alloc = PyType_GenericNew,2230    .tp_dealloc = (destructor)myobj_dealloc,2231    .tp_repr = (reprfunc)myobj_repr,2232    .tp_hash = (hashfunc)myobj_hash,2233    .tp_richcompare = PyBaseObject_Type.tp_richcompare,2234};2235```22362237Подкласс str, который нельзя наследовать и который нельзя вызывать для создания экземпляров (например, используется отдельная фабричная функция) с помощью флага [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION):22382239```c2240typedef struct {2241    PyUnicodeObject raw;2242    char *extra;2243} MyStr;22442245static PyTypeObject MyStr_Type = {2246    PyVarObject_HEAD_INIT(NULL, 0)2247    .tp_name = "mymod.MyStr",2248    .tp_basicsize = sizeof(MyStr),2249    .tp_base = NULL,  // устанавливается в &PyUnicode_Type при инициализации модуля2250    .tp_doc = PyDoc_STR("my custom str"),2251    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,2252    .tp_repr = (reprfunc)myobj_repr,2253};2254```22552256Простейший [статический тип](https://python-all.ru/3.13/c-api/typeobj.html#static-types) с экземплярами фиксированной длины:22572258```c2259typedef struct {2260    PyObject_HEAD2261} MyObject;22622263static PyTypeObject MyObject_Type = {2264    PyVarObject_HEAD_INIT(NULL, 0)2265    .tp_name = "mymod.MyObject",2266};2267```22682269Простейший [статический тип](https://python-all.ru/3.13/c-api/typeobj.html#static-types) с экземплярами переменной длины:22702271```c2272typedef struct {2273    PyObject_VAR_HEAD2274    const char *data[1];2275} MyObject;22762277static PyTypeObject MyObject_Type = {2278    PyVarObject_HEAD_INIT(NULL, 0)2279    .tp_name = "mymod.MyObject",2280    .tp_basicsize = sizeof(MyObject) - sizeof(char *),2281    .tp_itemsize = sizeof(char *),2282};2283```2284