typeobj.md
1> **Источник:** https://python-all.ru/3.16/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.16/c-api/type.html#c.PyTypeObject). Объекты типа можно обрабатывать с помощью любой из функций `PyObject_*` или `PyType_*`, но для большинства приложений Python они не представляют большого интереса. Эти объекты являются основой поведения объектов, поэтому они очень важны как для самого интерпретатора, так и для любых модулей расширения, реализующих новые типы.1011Объекты типа довольно велики по сравнению с большинством стандартных типов. Причина такого размера в том, что каждый объект типа хранит большое количество значений, в основном указателей на функции C, каждый из которых реализует небольшую часть функциональности типа. Поля объекта типа подробно рассматриваются в этом разделе. Поля будут описаны в порядке их появления в структуре.1213В дополнение к следующему краткому справочнику раздел [Примеры](https://python-all.ru/3.16/c-api/typeobj.html#typedef-examples) даёт представление о значении и использовании [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject).1415## Краткий справочник1617### “tp slots”1819| PyTypeObject Slot [\[1\]](https://python-all.ru/3.16/c-api/typeobj.html#slots) | [Тип](https://python-all.ru/3.16/c-api/typeobj.html#slot-typedefs-table) | специальные методы/атрибуты | Информация [\[2\]](https://python-all.ru/3.16/c-api/typeobj.html#cols) | | | |20| --- | --- | --- | --- | --- | --- | --- |21| O | T | D | I | | | |22| \<R\> [`tp_name`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_name) | const char \* | name | X | X | | |23| [`tp_basicsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_basicsize) | [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | | X | X | | X |24| [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) | [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | | | X | | X |25| [`tp_dealloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dealloc) | [`destructor`](https://python-all.ru/3.16/c-api/typeobj.html#c.destructor) | | X | X | | X |26| [`tp_vectorcall_offset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) | [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | | | X | | X |27| ([`tp_getattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattr)) | [`getattrfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getattrfunc) | getattribute\_\_, \_\_getattr | | | | G |28| ([`tp_setattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattr)) | [`setattrfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.setattrfunc) | setattr\_\_, \_\_delattr | | | | G |29| [`tp_as_async`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_async) | [`PyAsyncMethods`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyAsyncMethods) \* | [подслоты](https://python-all.ru/3.16/c-api/typeobj.html#sub-slots) | | | | % |30| [`tp_repr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_repr) | [`reprfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.reprfunc) | repr | X | X | | X |31| [`tp_as_number`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_number) | [`PyNumberMethods`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods) \* | [подслоты](https://python-all.ru/3.16/c-api/typeobj.html#sub-slots) | | | | % |32| [`tp_as_sequence`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_sequence) | [`PySequenceMethods`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods) \* | [подслоты](https://python-all.ru/3.16/c-api/typeobj.html#sub-slots) | | | | % |33| [`tp_as_mapping`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_mapping) | [`PyMappingMethods`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyMappingMethods) \* | [подслоты](https://python-all.ru/3.16/c-api/typeobj.html#sub-slots) | | | | % |34| [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash) | [`hashfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.hashfunc) | hash | X | | | G |35| [`tp_call`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_call) | [`ternaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ternaryfunc) | call | | X | | X |36| [`tp_str`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_str) | [`reprfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.reprfunc) | str | X | | | X |37| [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro) | [`getattrofunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getattrofunc) | getattribute\_\_, \_\_getattr | X | X | | G |38| [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro) | [`setattrofunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.setattrofunc) | setattr\_\_, \_\_delattr | X | X | | G |39| [`tp_as_buffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer) | [`PyBufferProcs`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyBufferProcs) \* | [подслоты](https://python-all.ru/3.16/c-api/typeobj.html#sub-slots) | | | | % |40| [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags) | unsigned long | | X | X | | ? |41| [`tp_doc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_doc) | const char \* | doc | X | X | | |42| [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse) | [`traverseproc`](https://python-all.ru/3.16/c-api/gcsupport.html#c.traverseproc) | | | X | | G |43| [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) | [`inquiry`](https://python-all.ru/3.16/c-api/gcsupport.html#c.inquiry) | | | X | | G |44| [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) | [`richcmpfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.richcmpfunc) | lt\_\_, \_\_le\_\_, \_\_eq\_\_, \_\_ne\_\_, \_\_gt\_\_, \_\_ge | X | | | G |45| ([`tp_weaklistoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset)) | [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | | | X | | ? |46| [`tp_iter`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_iter) | [`getiterfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getiterfunc) | iter | | | | X |47| [`tp_iternext`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_iternext) | [`iternextfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.iternextfunc) | next | | | | X |48| [`tp_methods`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_methods) | [`PyMethodDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyMethodDef) \[\] | | X | X | | |49| [`tp_members`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_members) | [`PyMemberDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyMemberDef) \[\] | | | X | | |50| [`tp_getset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getset) | [`PyGetSetDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyGetSetDef) \[\] | | X | X | | |51| [`tp_base`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_base) | [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject) \* | base | | | X | |52| [`tp_dict`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dict) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | dict | | | ? | |53| [`tp_descr_get`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_descr_get) | [`descrgetfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.descrgetfunc) | get | | | | X |54| [`tp_descr_set`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_descr_set) | [`descrsetfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.descrsetfunc) | set\_\_, \_\_delete | | | | X |55| ([`tp_dictoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset)) | [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | | | X | | ? |56| [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init) | [`initproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.initproc) | init | X | X | | X |57| [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc) | [`allocfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.allocfunc) | | X | | ? | ? |58| [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) | [`newfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.newfunc) | new | X | X | ? | ? |59| [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free) | [`freefunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.freefunc) | | X | X | ? | ? |60| [`tp_is_gc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_is_gc) | [`inquiry`](https://python-all.ru/3.16/c-api/gcsupport.html#c.inquiry) | | | X | | X |61| \<[`tp_bases`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_bases)\> | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | bases | | | ~ | |62| \<[`tp_mro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_mro)\> | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | mro | | | ~ | |63| \[[`tp_cache`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_cache)\] | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | | | | | |64| \[[`tp_subclasses`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_subclasses)\] | void \* | subclasses | | | | |65| \[[`tp_weaklist`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklist)\] | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | | | | | |66| ([`tp_del`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_del)) | [`destructor`](https://python-all.ru/3.16/c-api/typeobj.html#c.destructor) | | | | | |67| \[[`tp_version_tag`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_version_tag)\] | unsigned int | | | | | |68| [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize) | [`destructor`](https://python-all.ru/3.16/c-api/typeobj.html#c.destructor) | del | | | | X |69| [`tp_vectorcall`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall) | [`vectorcallfunc`](https://python-all.ru/3.16/c-api/call.html#c.vectorcallfunc) | | | | | |70| \[[`tp_watched`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_watched)\] | unsigned char | | | | | |7172\[[1](https://python-all.ru/3.16/c-api/typeobj.html#id1)\]7374**()**: Имя слота в круглых скобках указывает, что оно (фактически) устарело.7576**\<\>**: Имена в угловых скобках должны быть изначально установлены в `NULL` и считаться только для чтения.7778**\[\]**: Имена в квадратных скобках предназначены только для внутреннего использования.7980**\<R\>** (в качестве префикса) означает, что поле обязательно (должно быть не-`NULL`).8182\[[2](https://python-all.ru/3.16/c-api/typeobj.html#id2)\]8384Столбцы:8586**“O”**: устанавливается на [`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type)8788**“T”**: устанавливается на [`PyType_Type`](https://python-all.ru/3.16/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.16/c-api/typeobj.html#slot-typedefs-table) | специальные методы |114| --- | --- | --- |115| [`am_await`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyAsyncMethods.am_await) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | await |116| [`am_aiter`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyAsyncMethods.am_aiter) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | aiter |117| [`am_anext`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyAsyncMethods.am_anext) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | anext |118| [`am_send`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyAsyncMethods.am_send) | [`sendfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.sendfunc) | |119| | | |120| [`nb_add`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_add) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | add\_\_ \_\_radd |121| [`nb_inplace_add`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_add) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | iadd |122| [`nb_subtract`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_subtract) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | sub\_\_ \_\_rsub |123| [`nb_inplace_subtract`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_subtract) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | isub |124| [`nb_multiply`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_multiply) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | mul\_\_ \_\_rmul |125| [`nb_inplace_multiply`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_multiply) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | imul |126| [`nb_remainder`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_remainder) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | mod\_\_ \_\_rmod |127| [`nb_inplace_remainder`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_remainder) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | imod |128| [`nb_divmod`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_divmod) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | divmod\_\_ \_\_rdivmod |129| [`nb_power`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_power) | [`ternaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ternaryfunc) | pow\_\_ \_\_rpow |130| [`nb_inplace_power`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_power) | [`ternaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ternaryfunc) | ipow |131| [`nb_negative`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_negative) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | neg |132| [`nb_positive`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_positive) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | pos |133| [`nb_absolute`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_absolute) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | abs |134| [`nb_bool`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_bool) | [`inquiry`](https://python-all.ru/3.16/c-api/gcsupport.html#c.inquiry) | bool |135| [`nb_invert`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_invert) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | invert |136| [`nb_lshift`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_lshift) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | lshift\_\_ \_\_rlshift |137| [`nb_inplace_lshift`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_lshift) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | ilshift |138| [`nb_rshift`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_rshift) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | rshift\_\_ \_\_rrshift |139| [`nb_inplace_rshift`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_rshift) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | irshift |140| [`nb_and`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_and) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | and\_\_ \_\_rand |141| [`nb_inplace_and`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_and) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | iand |142| [`nb_xor`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_xor) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | xor\_\_ \_\_rxor |143| [`nb_inplace_xor`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_xor) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | ixor |144| [`nb_or`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_or) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | or\_\_ \_\_ror |145| [`nb_inplace_or`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_or) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | ior |146| [`nb_int`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_int) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | int |147| [`nb_reserved`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_reserved) | void \* | |148| [`nb_float`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_float) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | float |149| [`nb_floor_divide`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_floor_divide) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | floordiv |150| [`nb_inplace_floor_divide`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_floor_divide) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | ifloordiv |151| [`nb_true_divide`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_true_divide) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | truediv |152| [`nb_inplace_true_divide`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_true_divide) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | itruediv |153| [`nb_index`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_index) | [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | index |154| [`nb_matrix_multiply`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_matrix_multiply) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | matmul\_\_ \_\_rmatmul |155| [`nb_inplace_matrix_multiply`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_matrix_multiply) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | imatmul |156| | | |157| [`mp_length`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyMappingMethods.mp_length) | [`lenfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.lenfunc) | len |158| [`mp_subscript`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyMappingMethods.mp_subscript) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | getitem |159| [`mp_ass_subscript`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyMappingMethods.mp_ass_subscript) | [`objobjargproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.objobjargproc) | setitem\_\_, \_\_delitem |160| | | |161| [`sq_length`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_length) | [`lenfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.lenfunc) | len |162| [`sq_concat`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_concat) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | add |163| [`sq_repeat`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_repeat) | [`ssizeargfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ssizeargfunc) | mul |164| [`sq_item`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_item) | [`ssizeargfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ssizeargfunc) | getitem |165| [`sq_ass_item`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_ass_item) | [`ssizeobjargproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ssizeobjargproc) | setitem\_\_ \_\_delitem |166| [`sq_contains`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_contains) | [`objobjproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.objobjproc) | contains |167| [`sq_inplace_concat`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_inplace_concat) | [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | iadd |168| [`sq_inplace_repeat`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_inplace_repeat) | [`ssizeargfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ssizeargfunc) | imul |169| | | |170| [`bf_getbuffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer) | [`getbufferproc()`](https://python-all.ru/3.16/c-api/typeobj.html#c.getbufferproc) | buffer |171| [`bf_releasebuffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) | [`releasebufferproc()`](https://python-all.ru/3.16/c-api/typeobj.html#c.releasebufferproc) | release\_buffer |172173### slot typedefs174175| typedef | Типы параметров | Тип возвращаемого значения |176| --- | --- | --- |177| [`allocfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.allocfunc) | [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject) \* [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |178| [`destructor`](https://python-all.ru/3.16/c-api/typeobj.html#c.destructor) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | void |179| [`freefunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.freefunc) | void \* | void |180| [`traverseproc`](https://python-all.ru/3.16/c-api/gcsupport.html#c.traverseproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`visitproc`](https://python-all.ru/3.16/c-api/gcsupport.html#c.visitproc) void \* | int |181| [`newfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.newfunc) | [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |182| [`initproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.initproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |183| [`reprfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.reprfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |184| [`getattrfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getattrfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* const char \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |185| [`setattrfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.setattrfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* const char \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |186| [`getattrofunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getattrofunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |187| [`setattrofunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.setattrofunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |188| [`descrgetfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.descrgetfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |189| [`descrsetfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.descrsetfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |190| [`hashfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.hashfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | Py\_hash\_t |191| [`richcmpfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.richcmpfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* int | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |192| [`getiterfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getiterfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |193| [`iternextfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.iternextfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |194| [`lenfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.lenfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) |195| [`getbufferproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.getbufferproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`Py_buffer`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer) \* int | int |196| [`releasebufferproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.releasebufferproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`Py_buffer`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer) \* | void |197| [`inquiry`](https://python-all.ru/3.16/c-api/gcsupport.html#c.inquiry) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |198| [`unaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.unaryfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |199| [`binaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.binaryfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |200| [`ternaryfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ternaryfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |201| [`ssizeargfunc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ssizeargfunc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* |202| [`ssizeobjargproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.ssizeobjargproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`Py_ssize_t`](https://python-all.ru/3.16/c-api/intro.html#c.Py_ssize_t) [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |203| [`objobjproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.objobjproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |204| [`objobjargproc`](https://python-all.ru/3.16/c-api/typeobj.html#c.objobjargproc) | [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) \* | int |205206Подробнее см. [определения типов слотов](https://python-all.ru/3.16/c-api/typeobj.html#id6) ниже.207208## Определение PyTypeObject209210Определение структуры для [`PyTypeObject`](https://python-all.ru/3.16/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 PyMethodDef *tp_methods;270 PyMemberDef *tp_members;271 PyGetSetDef *tp_getset;272 // Сильная ссылка на тип в куче, заимствованная ссылка на статический тип273 PyTypeObject *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 void *tp_subclasses; /* для статических встроенных типов это индекс */287 PyObject *tp_weaklist; /* не используется для статических встроенных типов */288 destructor tp_del;289290 /* Тег версии кэша атрибутов типа. Добавлено в версии 2.6.291 * Если ноль, кэш недействителен и должен быть инициализирован.292 */293 unsigned int tp_version_tag;294295 destructor tp_finalize;296 vectorcallfunc tp_vectorcall;297298 /* битовый набор, указывающий, какие наблюдатели типов следят за этим типом */299 unsigned char tp_watched;300301 /* Количество используемых значений tp_version_tag.302 * Устанавливается в _Py_ATTR_CACHE_UNUSED, если кэш атрибутов303 * отключен для этого типа (например, из-за пользовательских записей MRO).304 * В противном случае ограничено MAX_VERSIONS_PER_CLASS (определено в другом месте).305 */306 uint16_t tp_versions_used;307} PyTypeObject;308```309310## Слоты PyObject311312Структура объекта типа расширяет структуру [`PyVarObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject). Поле [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size) используется для динамических типов (создаваемых с помощью `type_new()`, обычно вызываемого из инструкции class). Обратите внимание, что [`PyType_Type`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Type) (метатип) инициализирует [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize), что означает, что его экземпляры (т.е. объекты типов) *должны* иметь поле `ob_size`.313314[`PyObject.ob_refcnt`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_refcnt)315316> Счётчик ссылок объекта типа инициализируется значением `1` макросом `PyObject_HEAD_INIT`. Обратите внимание, что для [статически выделенных объектов типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types), экземпляры типа (объекты, чей [`ob_type`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_type) указывает обратно на тип) *не* считаются ссылками. Но для [динамически выделенных объектов типов](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) экземпляры *считаются* ссылками.317>318> **Наследование:**319>320> Это поле не наследуется подтипами.321322[`PyObject.ob_type`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_type)323324> Это тип типа, иными словами, его метатип. Он инициализируется аргументом макроса `PyObject_HEAD_INIT`, и его значением обычно должно быть `&PyType_Type`. Однако для динамически загружаемых модулей расширения, которые должны работать на Windows (по крайней мере), компилятор сообщает, что это недопустимый инициализатор. Поэтому принято передавать `NULL` макросу `PyObject_HEAD_INIT` и явно инициализировать это поле в начале функции инициализации модуля, перед любыми другими действиями. Обычно это делается так:325>326> ```c327> Foo_Type.ob_type = &PyType_Type;328> ```329>330> Это должно быть сделано до создания любых экземпляров типа. [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) проверяет, равен ли [`ob_type`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_type) значению `NULL`, и если да, инициализирует его значением поля `ob_type` базового класса. `PyType_Ready()` не будет изменять это поле, если оно ненулевое.331>332> **Наследование:**333>334> Это поле наследуется подтипами.335336## Слоты PyVarObject337338[`PyVarObject.ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size)339340> Для [статически выделенных объектов типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types) это поле должно быть инициализировано нулём. Для [динамически выделенных объектов типов](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) это поле имеет особый внутренний смысл.341>342> К этому полю следует обращаться с помощью макроса [`Py_SIZE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_SIZE).343>344> **Наследование:**345>346> Это поле не наследуется подтипами.347348## Слоты PyTypeObject349350Каждый слот имеет раздел, описывающий наследование. Если [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) может устанавливать значение, когда поле установлено в `NULL`, то также будет раздел «Default» (значение по умолчанию). (Обратите внимание, что многие поля, заданные в [`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type) и [`PyType_Type`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Type), фактически действуют как значения по умолчанию.)351352#### `const char *PyTypeObject.tp_name`353354См. [`Py_tp_name`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_name) для соответствующего [`Slot ID`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot.sl_id).355356Указатель на строку, завершающуюся NUL, содержащую имя типа. Для типов, доступных как глобальные переменные модуля, строка должна содержать полное имя модуля, за которым следует точка, а затем имя типа; для встроенных типов это должно быть просто имя типа. Если модуль является подмодулем пакета, полное имя пакета является частью полного имени модуля. Например, тип с именем `T`, определённый в модуле `M` в подпакете `Q` пакета `P`, должен иметь инициализатор [`tp_name`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_name) со значением `"P.Q.M.T"`.357358Для [динамически выделенных объектов типов](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) это должно быть просто имя типа, а имя модуля должно быть явно сохранено в словаре типа как значение для ключа `'__module__'`.359360Для [статически размещённых объектов типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types), поле *tp\_name* должно содержать точку. Всё до последней точки становится доступно как атрибут [`__module__`](https://python-all.ru/3.16/reference/datamodel.html#type.__module__), а всё после последней точки – как атрибут [`__name__`](https://python-all.ru/3.16/reference/datamodel.html#type.__name__).361362Если точка отсутствует, всё поле [`tp_name`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_name) становится доступным как атрибут [`__name__`](https://python-all.ru/3.16/reference/datamodel.html#type.__name__), а атрибут [`__module__`](https://python-all.ru/3.16/reference/datamodel.html#type.__module__) не определён (если только не задан явно в словаре, как описано выше). Это означает, что ваш тип невозможно будет сериализовать с помощью pickle. Кроме того, он не будет отображаться в документации модуля, создаваемой pydoc.363364Это поле не должно быть `NULL`. Это единственное обязательное поле в [`PyTypeObject()`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject) (кроме потенциально [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize)).365366**Наследование:**367368Это поле не наследуется подтипами.369370#### `Py_ssize_t PyTypeObject.tp_basicsize`371372#### `Py_ssize_t PyTypeObject.tp_itemsize`373374Эти поля позволяют вычислить размер экземпляров типа в байтах.375376Смотрите [`Py_tp_basicsize`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_basicsize), [`Py_tp_extra_basicsize`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_extra_basicsize) и [`Py_tp_itemsize`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_itemsize) для соответствующих [`Slot IDs`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot.sl_id).377378Существует два вида типов: типы с экземплярами фиксированной длины имеют нулевое поле `tp_itemsize`, типы с экземплярами переменной длины имеют ненулевое поле `tp_itemsize`. Для типа с экземплярами фиксированной длины все экземпляры имеют одинаковый размер, заданный в `tp_basicsize`. (Исключения из этого правила могут быть сделаны с помощью [`PyUnstable_Object_GC_NewWithExtraData()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyUnstable_Object_GC_NewWithExtraData).)379380Для типа с экземплярами переменной длины экземпляры должны иметь поле [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size), а размер экземпляра равен `tp_basicsize` плюс N раз `tp_itemsize`, где N – это «длина» объекта.381382Такие функции, как [`PyObject_NewVar()`](https://python-all.ru/3.16/c-api/allocation.html#c.PyObject_NewVar), принимают значение N в качестве аргумента и сохраняют его в поле [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size) экземпляра. Обратите внимание, что поле `ob_size` впоследствии может использоваться для других целей. Например, экземпляры [`int`](https://python-all.ru/3.16/library/functions.html#int) используют биты `ob_size` способом, определяемым реализацией; для доступа к базовому хранилищу и его размеру следует использовать [`PyLong_Export()`](https://python-all.ru/3.16/c-api/long.html#c.PyLong_Export).383384> **Примечание**385>386> К полю [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size) следует обращаться с помощью макросов [`Py_SIZE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_SIZE) и [`Py_SET_SIZE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_SET_SIZE).387388Кроме того, наличие поля [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size) в структуре экземпляра не означает, что структура экземпляра имеет переменную длину. Например, тип [`list`](https://python-all.ru/3.16/library/stdtypes.html#list) имеет экземпляры фиксированной длины, но эти экземпляры содержат поле `ob_size`. (Как и в случае с [`int`](https://python-all.ru/3.16/library/functions.html#int), избегайте прямого чтения `ob_size` списков. Вместо этого вызывайте [`PyList_Size()`](https://python-all.ru/3.16/c-api/list.html#c.PyList_Size).)389390Поле `tp_basicsize` включает размер, необходимый для данных [`tp_base`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_base) типа, а также любые дополнительные данные, необходимые каждому экземпляру.391392Правильный способ установки `tp_basicsize` – использовать оператор `sizeof` для структуры, используемой для объявления структуры экземпляра. Эта структура должна включать структуру, используемую для объявления базового типа. Другими словами, `tp_basicsize` должно быть больше или равно `tp_basicsize` базового типа.393394Поскольку каждый тип является подтипом [`object`](https://python-all.ru/3.16/library/functions.html#object), эта структура должна включать [`PyObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject) или [`PyVarObject`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject) (в зависимости от того, должен ли быть включён [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size)). Обычно они определяются макросом [`PyObject_HEAD`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject_HEAD) или [`PyObject_VAR_HEAD`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject_VAR_HEAD) соответственно.395396Базовый размер не включает размер заголовка GC, поскольку этот заголовок не является частью [`PyObject_HEAD`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject_HEAD).397398Для случаев, когда структура, используемая для объявления базового типа, неизвестна, см. [`PyType_Spec.basicsize`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Spec.basicsize) и [`PyType_FromMetaclass()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromMetaclass).399400Примечания о выравнивании:401402- `tp_basicsize` должно быть кратно `_Alignof(PyObject)`. При использовании `sizeof` в `struct`, включающем [`PyObject_HEAD`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject_HEAD), как рекомендуется, компилятор обеспечивает это. При отказе от C-структуры `struct` или при использовании расширений компилятора, таких как `__attribute__((packed))`, ответственность ложится на вас.403- Если элементы переменной части требуют определённого выравнивания, `tp_basicsize` и `tp_itemsize` должны быть кратны этому выравниванию. Например, если переменная часть типа хранит `double`, вы обязаны убедиться, что оба поля кратны `_Alignof(double)`.404405**Наследование:**406407Эти поля наследуются подтипами по отдельности. (То есть, если поле установлено в ноль, [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) скопирует значение из базового типа, указывая, что экземпляры не нуждаются в дополнительном хранилище.)408409Если базовый тип имеет ненулевое [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize), обычно небезопасно устанавливать `tp_itemsize` в другое ненулевое значение в подтипе (хотя это зависит от реализации базового типа).410411#### `destructor PyTypeObject.tp_dealloc`412413*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_dealloc` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*414415Указатель на функцию-деструктор экземпляра. Сигнатура функции:416417```c418void tp_dealloc(PyObject *self);419```420421Функция-деструктор должна удалить все ссылки, которыми владеет экземпляр (например, вызвать [`Py_CLEAR()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_CLEAR)), освободить все буферы памяти, принадлежащие экземпляру, и вызвать функцию [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free) типа для освобождения самого объекта.422423Если могут вызываться функции, которые устанавливают индикатор ошибки, необходимо использовать [`PyErr_GetRaisedException()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_GetRaisedException) и [`PyErr_SetRaisedException()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_SetRaisedException), чтобы гарантировать, что предсуществующий индикатор ошибки не будет испорчен (освобождение могло произойти при обработке другой ошибки):424425```c426static void427foo_dealloc(foo_object *self)428{429 PyObject *et, *ev, *etb;430 PyObject *exc = PyErr_GetRaisedException();431 ...432 PyErr_SetRaisedException(exc);433}434```435436Сам обработчик освобождения не должен вызывать исключение; если он наталкивается на ошибочную ситуацию, он должен вызвать [`PyErr_FormatUnraisable()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_FormatUnraisable) для регистрации (и очистки) невыбрасываемого исключения.437438Не даётся никаких гарантий относительно того, когда объект уничтожается, за исключением:439440- Python уничтожает объект сразу или через некоторое время после удаления последней ссылки на него, если только его финализатор ([`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize)) впоследствии не воскресит объект.441- Объект не будет уничтожен, пока он автоматически финализируется ([`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize)) или автоматически очищается ([`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)).442443В CPython объект в настоящее время уничтожается сразу из [`Py_DECREF()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_DECREF) когда счётчик ссылок становится равным нулю, но в будущих версиях это может измениться.444445Рекомендуется вызывать [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc) в начале `tp_dealloc`, чтобы гарантировать, что объект всегда финализируется перед уничтожением.446447Если тип поддерживает сборку мусора (установлен флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) ), деструктор должен вызывать [`PyObject_GC_UnTrack()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_UnTrack) перед очисткой любых полей-членов.448449Допускается вызывать [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) из `tp_dealloc`, чтобы уменьшить дублирование кода и гарантировать, что объект всегда очищается перед уничтожением. Учтите, что `tp_clear` мог быть уже вызван.450451Если тип размещается в куче ([`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE)), деаллокатор должен освободить принадлежащую ему ссылку на объект типа (через [`Py_DECREF()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_DECREF)) после вызова деаллокатора типа. См. пример кода ниже:452453```c454static void455foo_dealloc(PyObject *op)456{457 foo_object *self = (foo_object *) op;458 PyObject_GC_UnTrack(self);459 Py_CLEAR(self->ref);460 Py_TYPE(self)->tp_free(self);461}462```463464`tp_dealloc` должен оставлять состояние исключения неизменным. Если ему нужно вызвать что-то, что может возбудить исключение, состояние исключения необходимо сначала сохранить, а затем восстановить (после регистрации любых исключений с помощью [`PyErr_WriteUnraisable()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_WriteUnraisable)).465466Пример:467468```c469static void470foo_dealloc(PyObject *self)471{472 PyObject *exc = PyErr_GetRaisedException();473474 if (PyObject_CallFinalizerFromDealloc(self) < 0) {475 // self был воскрешен.476 goto done;477 }478479 PyTypeObject *tp = Py_TYPE(self);480481 if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) {482 PyObject_GC_UnTrack(self);483 }484485 // Необязательно, но удобно для избежания дублирования кода.486 if (tp->tp_clear && tp->tp_clear(self) < 0) {487 PyErr_WriteUnraisable(self);488 }489490 // Любое дополнительное уничтожение размещается здесь.491492 tp->tp_free(self);493 self = NULL; // На случай, если ниже вызывается PyErr_WriteUnraisable().494495 if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) {496 Py_CLEAR(tp);497 }498499done:500 // Необязательно, если было вызвано что-то, что могло вызвать501 // исключение.502 if (PyErr_Occurred()) {503 PyErr_WriteUnraisable(self);504 }505 PyErr_SetRaisedException(exc);506}507```508509`tp_dealloc` может быть вызван из любого потока Python, не обязательно из того, который создал объект (если объект становится частью цикла ссылок, этот цикл может быть собран сборщиком мусора в любом потоке). Это не проблема для вызовов Python API, поскольку поток, в котором вызывается `tp_dealloc`, имеет [присоединённое состояние потока](https://python-all.ru/3.16/glossary.html#term-attached-thread-state). Однако если уничтожаемый объект в свою очередь уничтожает объекты из какой-то другой библиотеки на C, следует соблюдать осторожность, чтобы уничтожение этих объектов в потоке, вызвавшем `tp_dealloc`, не нарушило никаких предположений этой библиотеки.510511**Наследование:**512513Это поле наследуется подтипами.514515> **См. также**516>517> [Жизненный цикл объекта](https://python-all.ru/3.16/c-api/lifecycle.html#life-cycle) для подробностей о том, как этот слот связан с другими слотами.518519#### `Py_ssize_t PyTypeObject.tp_vectorcall_offset`520521Необязательное смещение к поинстансной функции, реализующей вызов объекта с помощью [протокола vectorcall](https://python-all.ru/3.16/c-api/call.html#vectorcall), более эффективная альтернатива более простому [`tp_call`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_call).522523Это поле используется только в том случае, если установлен флаг [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL) . В этом случае оно должно быть положительным целым числом, содержащим смещение в экземпляре указателя [`vectorcallfunc`](https://python-all.ru/3.16/c-api/call.html#c.vectorcallfunc).524525Указатель *vectorcallfunc* может быть `NULL`, и в этом случае экземпляр ведёт себя так, как если бы [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL) не был установлен: вызов экземпляра сводится к [`tp_call`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_call).526527Любой класс, устанавливающий `Py_TPFLAGS_HAVE_VECTORCALL`, должен также установить [`tp_call`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_call) и убедиться, что его поведение согласуется с функцией *vectorcallfunc*. Это можно сделать, установив *tp\_call* в [`PyVectorcall_Call()`](https://python-all.ru/3.16/c-api/call.html#c.PyVectorcall_Call).528529Изменено в версии 3.8: До версии 3.8 этот слот назывался `tp_print`. В Python 2.x он использовался для вывода в файл. В Python 3.0–3.7 он не использовался.530531Изменено в версии 3.12: До версии 3.12 не рекомендовалось для [изменяемых типов, размещаемых в куче](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) реализовывать протокол vectorcall. Когда пользователь устанавливает [`__call__`](https://python-all.ru/3.16/reference/datamodel.html#object.__call__) в коде Python, обновляется только *tp\_call*, что, вероятно, делает его несовместимым с функцией vectorcall. Начиная с версии 3.12, установка `__call__` отключает оптимизацию vectorcall путём сброса флага [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL).532533**Наследование:**534535Это поле всегда наследуется. Однако флаг [`Py_TPFLAGS_HAVE_VECTORCALL`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_VECTORCALL) наследуется не всегда. Если он не установлен, то подкласс не будет использовать [vectorcall](https://python-all.ru/3.16/c-api/call.html#vectorcall), за исключением случаев, когда [`PyVectorcall_Call()`](https://python-all.ru/3.16/c-api/call.html#c.PyVectorcall_Call) вызывается явно.536537#### `getattrfunc PyTypeObject.tp_getattr`538539*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_getattr` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*540541Необязательный указатель на функцию получения строки атрибута.542543Это поле устарело. Если оно определено, оно должно указывать на функцию, которая действует так же, как функция [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro), но принимает C-строку вместо строкового объекта Python для указания имени атрибута.544545**Наследование:**546547Группа: [`tp_getattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattr), [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro)548549Это поле наследуется подтипами вместе с [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro): подтип наследует как [`tp_getattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattr), так и `tp_getattro` от своего базового типа, когда `tp_getattr` и `tp_getattro` подтипа оба равны `NULL`.550551#### `setattrfunc PyTypeObject.tp_setattr`552553*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_setattr` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*554555Необязательный указатель на функцию установки и удаления атрибутов.556557Это поле устарело. Если оно определено, оно должно указывать на функцию, которая действует так же, как функция [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro), но принимает C-строку вместо строкового объекта Python для указания имени атрибута.558559**Наследование:**560561Группа: [`tp_setattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattr), [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro)562563Это поле наследуется подтипами вместе с [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro): подтип наследует как [`tp_setattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattr), так и `tp_setattro` от своего базового типа, если `tp_setattr` и `tp_setattro` подтипа оба равны `NULL`.564565#### `PyAsyncMethods *PyTypeObject.tp_as_async`566567Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протоколы [ожидаемого объекта](https://python-all.ru/3.16/glossary.html#term-awaitable) и [асинхронного итератора](https://python-all.ru/3.16/glossary.html#term-asynchronous-iterator) на уровне C. Подробнее см. в [Структуры асинхронных объектов](https://python-all.ru/3.16/c-api/typeobj.html#async-structs).568569Добавлено в версии 3.5: Ранее было известно как `tp_compare` и `tp_reserved`.570571**Наследование:**572573Поле [`tp_as_async`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_async) не наследуется, но содержащиеся в нём поля наследуются по отдельности.574575#### `reprfunc PyTypeObject.tp_repr`576577*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_repr` входит в состав [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*578579Необязательный указатель на функцию, реализующую встроенную функцию [`repr()`](https://python-all.ru/3.16/library/functions.html#repr).580581Сигнатура такая же, как для [`PyObject_Repr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Repr):582583```c584PyObject *tp_repr(PyObject *self);585```586587Функция должна возвращать строку или объект Unicode. В идеале она должна возвращать строку, которая при передаче в [`eval()`](https://python-all.ru/3.16/library/functions.html#eval) в подходящем окружении возвращает объект с тем же значением. Если это невозможно, она должна возвращать строку, начинающуюся с `'<'` и заканчивающуюся `'>'`, из которой можно вывести как тип, так и значение объекта.588589**Наследование:**590591Это поле наследуется подтипами.592593**По умолчанию:**594595Если это поле не задано, возвращается строка вида `<%s object at %p>`, где `%s` заменяется именем типа, а `%p` – адресом памяти объекта.596597#### `PyNumberMethods *PyTypeObject.tp_as_number`598599Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих числовой протокол. Эти поля описаны в [Структуры числовых объектов](https://python-all.ru/3.16/c-api/typeobj.html#number-structs).600601**Наследование:**602603Поле [`tp_as_number`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_number) не наследуется, но содержащиеся в нём поля наследуются по отдельности.604605#### `PySequenceMethods *PyTypeObject.tp_as_sequence`606607Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протокол последовательности. Эти поля описаны в [Структуры объектов-последовательностей](https://python-all.ru/3.16/c-api/typeobj.html#sequence-structs).608609**Наследование:**610611Поле [`tp_as_sequence`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_sequence) не наследуется, но содержащиеся в нём поля наследуются по отдельности.612613#### `PyMappingMethods *PyTypeObject.tp_as_mapping`614615Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протокол отображения. Эти поля описаны в [Структуры объектов-отображений](https://python-all.ru/3.16/c-api/typeobj.html#mapping-structs).616617**Наследование:**618619Поле [`tp_as_mapping`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_mapping) не наследуется, но содержащиеся в нём поля наследуются по отдельности.620621#### `hashfunc PyTypeObject.tp_hash`622623*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_hash` входит в состав [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*624625Необязательный указатель на функцию, реализующую встроенную функцию [`hash()`](https://python-all.ru/3.16/library/functions.html#hash).626627Сигнатура такая же, как для [`PyObject_Hash()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Hash):628629```c630Py_hash_t tp_hash(PyObject *);631```632633Значение `-1` не должно возвращаться как обычное возвращаемое значение; при возникновении ошибки во время вычисления хеш-значения функция должна установить исключение и вернуть `-1`.634635Если это поле не задано (*и* [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) не задано), то попытка получить хеш объекта вызывает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError). Это то же самое, что установить его в [`PyObject_HashNotImplemented()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_HashNotImplemented).636637Это поле можно явно установить в [`PyObject_HashNotImplemented()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_HashNotImplemented), чтобы заблокировать наследование хеш-метода от родительского типа. Это интерпретируется как эквивалент `__hash__ = None` на уровне Python, в результате чего `isinstance(o, collections.Hashable)` корректно возвращает `False`. Обратите внимание, что верно и обратное: установка `__hash__ = None` в классе на уровне Python приведет к тому, что слот `tp_hash` будет установлен в `PyObject_HashNotImplemented()`.638639**Наследование:**640641Группа: [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash), [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare)642643Это поле наследуется подтипами вместе с [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare): подтип наследует как `tp_richcompare`, так и [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash), если `tp_richcompare` и `tp_hash` подтипа равны `NULL`.644645**По умолчанию:**646647[`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_GenericHash()`](https://python-all.ru/3.16/c-api/hash.html#c.PyObject_GenericHash).648649#### `ternaryfunc PyTypeObject.tp_call`650651*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_call` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*652653Необязательный указатель на функцию, реализующую вызов объекта. Это значение должно быть `NULL`, если объект не является вызываемым. Сигнатура такая же, как у [`PyObject_Call()`](https://python-all.ru/3.16/c-api/call.html#c.PyObject_Call):654655```c656PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);657```658659**Наследование:**660661Это поле наследуется подтипами.662663#### `reprfunc PyTypeObject.tp_str`664665*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_str` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*666667Необязательный указатель на функцию, реализующую встроенную операцию [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str). (Обратите внимание, что [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) теперь является типом, а `str()` вызывает конструктор этого типа. Этот конструктор вызывает [`PyObject_Str()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Str) для выполнения фактической работы, и `PyObject_Str()` будет вызывать этот обработчик.)668669Сигнатура такая же, как для [`PyObject_Str()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Str):670671```c672PyObject *tp_str(PyObject *self);673```674675Функция должна возвращать строку или объект Unicode. Это должно быть «дружественное» строковое представление объекта, так как это представление будет использоваться, в частности, функцией [`print()`](https://python-all.ru/3.16/library/functions.html#print).676677**Наследование:**678679Это поле наследуется подтипами.680681**По умолчанию:**682683Если это поле не задано, вызывается [`PyObject_Repr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Repr) для возврата строкового представления.684685#### `getattrofunc PyTypeObject.tp_getattro`686687*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_getattro` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*688689Необязательный указатель на функцию получения атрибута.690691Сигнатура такая же, как для [`PyObject_GetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetAttr):692693```c694PyObject *tp_getattro(PyObject *self, PyObject *attr);695```696697Обычно удобно установить это поле в [`PyObject_GenericGetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GenericGetAttr), которое реализует обычный способ поиска атрибутов объекта.698699**Наследование:**700701Группа: [`tp_getattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattr), [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro)702703Это поле наследуется подтипами вместе с [`tp_getattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattr): подтип наследует как `tp_getattr`, так и [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro) от своего базового типа, когда `tp_getattr` и `tp_getattro` подтипа равны `NULL`.704705**По умолчанию:**706707[`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_GenericGetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GenericGetAttr).708709#### `setattrofunc PyTypeObject.tp_setattro`710711*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_setattro` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*712713Необязательный указатель на функцию для установки и удаления атрибутов.714715Сигнатура такая же, как для [`PyObject_SetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_SetAttr):716717```c718int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);719```720721Кроме того, установка *value* в `NULL` для удаления атрибута должна поддерживаться. Обычно удобно устанавливать это поле в [`PyObject_GenericSetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GenericSetAttr), которое реализует обычный способ установки атрибутов объекта.722723**Наследование:**724725Группа: [`tp_setattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattr), [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro)726727Это поле наследуется подтипами вместе с [`tp_setattr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattr): подтип наследует и `tp_setattr`, и [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro) от своего базового типа, когда `tp_setattr` и `tp_setattro` подтипа оба равны `NULL`.728729**По умолчанию:**730731[`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type) использует [`PyObject_GenericSetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GenericSetAttr).732733#### `PyBufferProcs *PyTypeObject.tp_as_buffer`734735Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих буферный интерфейс. Эти поля описаны в [Buffer Object Structures](https://python-all.ru/3.16/c-api/typeobj.html#buffer-structs).736737**Наследование:**738739Поле [`tp_as_buffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer) не наследуется, но содержащиеся в нем поля наследуются по отдельности.740741#### `unsigned long PyTypeObject.tp_flags`742743См. [`Py_tp_flags`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_flags) для соответствующего [`Slot ID`](https://python-all.ru/3.16/c-api/slots.html#c.PySlot.sl_id).744745Это поле представляет собой битовую маску различных флагов. Некоторые флаги указывают на изменённую семантику для определённых ситуаций; другие используются для указания того, что определённые поля в объекте типа (или в расширяющих структурах, на которые ссылаются через [`tp_as_number`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_number), [`tp_as_sequence`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_sequence), [`tp_as_mapping`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_mapping) и [`tp_as_buffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_as_buffer)), которые исторически не всегда присутствовали, теперь действительны; если такой бит флага сброшен, то поля типа, которые он защищает, не должны использоваться и должны считаться имеющими значение ноль или `NULL`.746747**Наследование:**748749Наследование этого поля сложное. Большинство битов флагов наследуются индивидуально, т.е. если у базового типа установлен бит флага, подтип наследует этот бит флага. Биты флагов, относящиеся к расширяющим структурам, строго наследуются, если наследуется расширяющая структура, т.е. значение бита флага базового типа копируется в подтип вместе с указателем на расширяющую структуру. Бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) наследуется вместе с полями [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear), т.е. если бит флага `Py_TPFLAGS_HAVE_GC` сброшен в подтипе, а поля `tp_traverse` и `tp_clear` в подтипе существуют и имеют значения `NULL`.750751**По умолчанию:**752753[`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type) использует `Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE`.754755**Битовые маски:**756757В настоящее время определены следующие битовые маски; их можно объединять с помощью оператора `|` для получения значения поля [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags). Макрос [`PyType_HasFeature()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_HasFeature) принимает тип и значение флагов, *tp* и *f*, и проверяет, является ли `tp->tp_flags & f` ненулевым.758759#### `Py_TPFLAGS_HEAPTYPE`760761Этот бит устанавливается, когда сам объект типа выделяется в куче, например, типы, созданные динамически с помощью [`PyType_FromSpec()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromSpec). В этом случае поле [`ob_type`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_type) его экземпляров считается ссылкой на тип, и объект типа инкрементируется (INCREF) при создании нового экземпляра, и декрементируется (DECREF) при уничтожении экземпляра (это не относится к экземплярам подтипов; только тип, на который ссылается ob\_type экземпляра, инкрементируется или декрементируется). Типы в куче также должны [поддерживать сборку мусора](https://python-all.ru/3.16/c-api/gcsupport.html#supporting-cycle-detection) так как они могут образовывать циклические ссылки с собственным объектом модуля.762763**Наследование:**764765???766767#### `Py_TPFLAGS_BASETYPE`768769*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*770771Этот бит устанавливается, когда тип может использоваться как базовый тип другого типа. Если этот бит сброшен, тип не может быть унаследован (аналогично «финальному» классу в Java).772773**Наследование:**774775???776777#### `Py_TPFLAGS_READY`778779Этот бит устанавливается, когда объект типа был полностью инициализирован функцией [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready).780781**Наследование:**782783???784785#### `Py_TPFLAGS_READYING`786787Этот бит устанавливается, пока [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) находится в процессе инициализации объекта типа.788789**Наследование:**790791???792793#### `Py_TPFLAGS_HAVE_GC`794795*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*796797Этот бит устанавливается, если объект поддерживает сборку мусора. Если этот бит установлен, память для новых экземпляров (см. [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc)) должна выделяться с помощью [`PyObject_GC_New`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_New) или [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc), а освобождаться (см. [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free)) с помощью [`PyObject_GC_Del()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_Del). Дополнительная информация в разделе [Поддержка циклической сборки мусора](https://python-all.ru/3.16/c-api/gcsupport.html#supporting-cycle-detection).798799**Наследование:**800801Группа: [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse), [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)802803Бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) наследуется вместе с полями [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear), то есть если бит флага `Py_TPFLAGS_HAVE_GC` сброшен в подтипе, а поля `tp_traverse` и `tp_clear` в подтипе существуют и имеют значения `NULL`.804805#### `Py_TPFLAGS_DEFAULT`806807*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*808809Это битовая маска всех битов, относящихся к наличию определённых полей в объекте типа и его структурах расширения. В настоящее время она включает следующие биты: [`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_STACKLESS_EXTENSION).810811**Наследование:**812813???814815#### `Py_TPFLAGS_METHOD_DESCRIPTOR`816817*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) с версии 3.8.*818819Этот бит указывает, что объекты ведут себя как несвязанные методы.820821Если этот флаг установлен для `type(meth)`, то:822823- `meth.__get__(obj, cls)(*args, **kwds)` (при `obj` не None) должен быть эквивалентен `meth(obj, *args, **kwds)`.824- `meth.__get__(None, cls)(*args, **kwds)` должен быть эквивалентен `meth(*args, **kwds)`.825826Этот флаг включает оптимизацию для типичных вызовов методов, таких как `obj.meth()`: он позволяет избежать создания временного объекта «связанный метод» для `obj.meth`.827828Добавлено в версии 3.8.829830**Наследование:**831832Этот флаг никогда не наследуется типами, у которых не установлен флаг [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE). Для типов расширения он наследуется всякий раз, когда наследуется [`tp_descr_get`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_descr_get).833834#### `Py_TPFLAGS_MANAGED_DICT`835836Этот бит указывает, что экземпляры класса имеют атрибут [`__dict__`](https://python-all.ru/3.16/reference/datamodel.html#object.__dict__), и что память для словаря управляется виртуальной машиной.837838Если этот флаг установлен, [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) также должен быть установлен.839840Функция обхода типа должна вызывать [`PyObject_VisitManagedDict()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_VisitManagedDict), а функция очистки должна вызывать [`PyObject_ClearManagedDict()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_ClearManagedDict).841842Добавлено в версии 3.12.843844**Наследование:**845846Этот флаг наследуется, если только поле [`tp_dictoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) не установлено в суперклассе.847848#### `Py_TPFLAGS_MANAGED_WEAKREF`849850Этот бит указывает, что экземпляры класса должны поддерживать слабые ссылки.851852Если этот флаг установлен, [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) также должен быть установлен.853854Добавлено в версии 3.12.855856**Наследование:**857858Этот флаг наследуется, если только поле [`tp_weaklistoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) не установлено в суперклассе.859860#### `Py_TPFLAGS_PREHEADER`861862Эти биты указывают, что VM будет управлять некоторыми полями, сохраняя их перед объектом. В настоящее время этот макрос эквивалентен [Py\_TPFLAGS\_MANAGED\_DICT](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) | [Py\_TPFLAGS\_MANAGED\_WEAKREF](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF).863864Значение этого макроса зависит от реализации VM, поэтому оно нестабильно и может измениться в будущей версии. Вместо этого рекомендуется использовать отдельные флаги.865866Добавлено в версии 3.12.867868#### `Py_TPFLAGS_ITEMS_AT_END`869870*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.12.*871872Применим только к типам переменного размера, то есть с ненулевым [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize).873874Указывает, что часть переменного размера экземпляра этого типа находится в конце области памяти экземпляра, со смещением `Py_TYPE(obj)->tp_basicsize` (которое может отличаться в каждом подклассе).875876При установке этого флага убедитесь, что все суперклассы либо используют такое же расположение в памяти, либо не являются типами переменного размера. Python не проверяет это условие.877878Добавлено в версии 3.12.879880**Наследование:**881882Этот флаг наследуется.883884#### `Py_TPFLAGS_LONG_SUBCLASS`885886#### `Py_TPFLAGS_LIST_SUBCLASS`887888#### `Py_TPFLAGS_TUPLE_SUBCLASS`889890#### `Py_TPFLAGS_BYTES_SUBCLASS`891892#### `Py_TPFLAGS_UNICODE_SUBCLASS`893894#### `Py_TPFLAGS_DICT_SUBCLASS`895896#### `Py_TPFLAGS_BASE_EXC_SUBCLASS`897898#### `Py_TPFLAGS_TYPE_SUBCLASS`899900Такие функции, как [`PyLong_Check()`](https://python-all.ru/3.16/c-api/long.html#c.PyLong_Check), вызывают [`PyType_FastSubclass()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FastSubclass) с одним из этих флагов, чтобы быстро определить, является ли тип подклассом встроенного типа; такие конкретные проверки выполняются быстрее, чем общая проверка, например [`PyObject_IsInstance()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_IsInstance). Пользовательские типы, наследуемые от встроенных, должны иметь соответствующим образом установленный [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags), иначе код, взаимодействующий с такими типами, будет вести себя по-разному в зависимости от того, какая проверка используется.901902#### `Py_TPFLAGS_HAVE_FINALIZE`903904Этот бит устанавливается, когда слот [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize) присутствует в структуре типа.905906Добавлено в версии 3.4.907908Устарело с версии 3.8: Этот флаг больше не нужен, так как интерпретатор предполагает, что слот [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize) всегда присутствует в структуре типа.909910#### `Py_TPFLAGS_HAVE_VECTORCALL`911912*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.12.*913914Этот бит устанавливается, когда класс реализует [протокол vectorcall](https://python-all.ru/3.16/c-api/call.html#vectorcall). Подробнее см. [`tp_vectorcall_offset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset).915916**Наследование:**917918Этот бит наследуется, если [`tp_call`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_call) также наследуется.919920Добавлено в версии 3.8: как `_Py_TPFLAGS_HAVE_VECTORCALL`921922Изменено в версии 3.9: Переименовано в текущее имя без ведущего подчёркивания. Старое временное имя [мягко устарело](https://python-all.ru/3.16/glossary.html#term-soft-deprecated).923924Изменено в версии 3.12: Теперь этот флаг удаляется из класса, когда [`__call__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__call__) методу класса присваивается новое значение.925926Теперь этот флаг может наследоваться изменяемыми классами.927928#### `Py_TPFLAGS_IMMUTABLETYPE`929930Этот бит устанавливается для объектов типа, которые являются неизменяемыми: атрибуты типа нельзя ни установить, ни удалить.931932[`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) автоматически применяет этот флаг к [статическим типам](https://python-all.ru/3.16/c-api/typeobj.html#static-types).933934**Наследование:**935936Этот флаг не наследуется.937938Добавлено в версии 3.10.939940#### `Py_TPFLAGS_DISALLOW_INSTANTIATION`941942Запретить создание экземпляров типа: установить [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) в NULL и не создавать ключ `__new__` в словаре типа.943944Флаг должен быть установлен до создания типа, а не после. Например, его нужно установить до вызова [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) для этого типа.945946Флаг устанавливается автоматически для [статических типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types), если [`tp_base`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_base) равен NULL или `&PyBaseObject_Type`, и [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) равен NULL.947948**Наследование:**949950Этот флаг не наследуется. Однако подклассы нельзя будет инстанцировать, если они не предоставят ненулевой [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) (что возможно только через C API).951952> **Примечание**953>954> Чтобы запретить прямое создание экземпляров класса, но разрешить создание его подклассов (например, для [абстрактного базового класса](https://python-all.ru/3.16/glossary.html#term-abstract-base-class)), не используйте этот флаг. Вместо этого добейтесь, чтобы [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) завершался успешно только для подклассов.955956Добавлено в версии 3.10.957958#### `Py_TPFLAGS_MAPPING`959960Этот бит указывает, что экземпляры класса могут сопоставляться с шаблонами отображений при использовании в качестве объекта оператора [`match`](https://python-all.ru/3.16/reference/compound_stmts.html#match). Он автоматически устанавливается при регистрации или наследовании [`collections.abc.Mapping`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Mapping) и сбрасывается при регистрации [`collections.abc.Sequence`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Sequence).961962> **Примечание**963>964> [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING) и [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE) взаимоисключающие; одновременная активация обоих флагов является ошибкой.965966**Наследование:**967968Этот флаг наследуется типами, которые ещё не установили [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE).969970> **См. также**971>972> [**PEP 634**](https://python-all.ru/3.16/c-api/typeobj.html) – Структурное сопоставление с образцом: спецификация973974Добавлено в версии 3.10.975976#### `Py_TPFLAGS_SEQUENCE`977978Этот бит указывает, что экземпляры класса могут сопоставляться с шаблонами последовательностей при использовании в качестве объекта оператора [`match`](https://python-all.ru/3.16/reference/compound_stmts.html#match). Он автоматически устанавливается при регистрации или наследовании [`collections.abc.Sequence`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Sequence) и сбрасывается при регистрации [`collections.abc.Mapping`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Mapping).979980> **Примечание**981>982> [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING) и [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE) взаимоисключающие; одновременная активация обоих флагов является ошибкой.983984**Наследование:**985986Этот флаг наследуется типами, которые ещё не установили [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING).987988> **См. также**989>990> [**PEP 634**](https://python-all.ru/3.16/c-api/typeobj.html) – Структурное сопоставление с образцом: спецификация991992Добавлено в версии 3.10.993994#### `Py_TPFLAGS_VALID_VERSION_TAG`995996Внутренний флаг. Не устанавливайте и не сбрасывайте этот флаг. Чтобы указать, что класс изменился, вызовите [`PyType_Modified()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Modified)997998> **Предупреждение**999>1000> Этот флаг присутствует в заголовочных файлах, но не используется. Он будет удалён в будущей версии CPython.10011002#### `Py_TPFLAGS_HAVE_VERSION_TAG`10031004Этот макрос ничего не делает. Исторически он указывал, что поле [`tp_version_tag`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_version_tag) доступно и инициализировано.10051006[Мягкое устаревание](https://python-all.ru/3.16/glossary.html#term-soft-deprecated) начиная с версии 3.13.10071008#### `Py_TPFLAGS_INLINE_VALUES`10091010Этот бит указывает, что экземпляры этого типа будут иметь массив «встроенных значений», содержащий атрибуты объекта, размещённый сразу после конца объекта.10111012Для этого необходимо, чтобы был установлен [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).10131014**Наследование:**10151016Этот флаг не наследуется.10171018Добавлено в версии 3.13.10191020#### `Py_TPFLAGS_IS_ABSTRACT`10211022Этот бит указывает, что это абстрактный тип и поэтому не может быть инстанцирован.10231024**Наследование:**10251026Этот флаг не наследуется.10271028> **См. также**1029>1030> [`abc`](https://python-all.ru/3.16/library/abc.html#module-abc)10311032#### `Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`10331034Внутренний. Не устанавливайте и не снимайте этот флаг. Исторически это был зарезервированный флаг для использования в Stackless Python.10351036> **Предупреждение**1037>1038> Этот флаг присутствует в заголовочных файлах, но не используется. Он может быть удалён в будущей версии CPython.10391040#### `const char *PyTypeObject.tp_doc`10411042*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_doc` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*10431044Необязательный указатель на C-строку, завершающуюся символом NUL, содержащую строку документации для данного объекта типа. Он доступен как атрибут [`__doc__`](https://python-all.ru/3.16/reference/datamodel.html#type.__doc__) у типа и его экземпляров.10451046**Наследование:**10471048Это поле *не* наследуется подтипами.10491050#### `traverseproc PyTypeObject.tp_traverse`10511052*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_traverse` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*10531054Необязательный указатель на функцию обхода для сборщика мусора. Используется только если установлен бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).10551056См. документацию по [Traversal](https://python-all.ru/3.16/c-api/gcsupport.html#gc-traversal).10571058**Наследование:**10591060Группа: [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse), [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)10611062Это поле наследуется подтипами вместе с [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) и битом флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC): бит флага, [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и `tp_clear` наследуются от базового типа, если все они равны нулю в подтипе.10631064#### `inquiry PyTypeObject.tp_clear`10651066*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_clear` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*10671068Необязательный указатель на функцию очистки. Сигнатура:10691070```c1071int tp_clear(PyObject *);1072```10731074Назначение этой функции – разрывать циклические ссылки, которые приводят к образованию [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate), чтобы объекты можно было безопасно уничтожить. Очищенный объект является частично уничтоженным; такой объект не обязан удовлетворять инвариантам проектирования, соблюдаемым при нормальном использовании.10751076`tp_clear` не нужно удалять ссылки на объекты, которые не могут участвовать в циклических ссылках, такие как строки Python или целые числа Python. Однако может быть удобно очищать все ссылки и написать функцию [`tp_dealloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dealloc) типа так, чтобы она вызывала `tp_clear` во избежание дублирования кода. (Имейте в виду, что `tp_clear` могла уже быть вызвана. Предпочтительнее вызывать идемпотентные функции, такие как [`Py_CLEAR()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_CLEAR).)10771078Любую нетривиальную очистку следует выполнять в [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize), а не в `tp_clear`.10791080> **Примечание**1081>1082> Если `tp_clear` не удаётся разорвать циклическую ссылку, то объекты в [циклическом изоляте](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate) могут остаться не собираемыми на неопределённый срок («утечка»). См. [`gc.garbage`](https://python-all.ru/3.16/library/gc.html#gc.garbage).10831084> **Примечание**1085>1086> Референты (прямые и косвенные) могли уже быть очищены; нет гарантии, что они находятся в согласованном состоянии.10871088> **Примечание**1089>1090> Функцию [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) можно вызывать из любого потока.10911092> **Примечание**1093>1094> Нет гарантии, что объект будет автоматически очищен до вызова его деструктора ([`tp_dealloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)).10951096Эта функция отличается от деструктора ([`tp_dealloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)) следующим образом:10971098- Цель очистки объекта – удалить ссылки на другие объекты, которые могут участвовать в циклической ссылке. Цель деструктора, напротив, шире: он должен освободить *все* ресурсы, которыми владеет, включая ссылки на объекты, не участвующие в циклических ссылках (например, целые числа), а также собственную память объекта (путём вызова [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free)).1099- Когда вызывается `tp_clear`, другие объекты могут всё ещё содержать ссылки на очищаемый объект. Из-за этого `tp_clear` не должна освобождать собственную память объекта ([`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free)). Деструктор, напротив, вызывается только тогда, когда нет (сильных) ссылок, и поэтому он должен безопасно уничтожить сам объект, освободив его память.1100- `tp_clear` может никогда не быть вызвана автоматически. Деструктор объекта, напротив, будет автоматически вызван через некоторое время после того, как объект станет недостижимым (т.е. либо на объект нет ссылок, либо объект является членом [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate)).11011102Не даётся никаких гарантий относительно того, когда, если и как часто Python автоматически очищает объект, за исключением:11031104- Python не будет автоматически очищать объект, если он достижим, то есть на него есть ссылка и он не является членом [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate).1105- Python не будет автоматически очищать объект, если он не был автоматически финализирован (см. [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize)). (Если финализатор возродил объект, объект может быть или не быть снова автоматически финализирован перед очисткой.)1106- Если объект является членом [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate), Python не будет автоматически очищать его, если какой-либо член циклического изолята ещё не был автоматически финализирован ([`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize)).1107- Python не уничтожит объект до тех пор, пока не завершатся все автоматические вызовы его функции `tp_clear`. Это гарантирует, что разрыв цикла ссылок не сделает недействительным указатель `self`, пока `tp_clear` ещё выполняется.1108- Python не будет автоматически вызывать `tp_clear` несколько раз одновременно.11091110В CPython в настоящее время объекты автоматически очищаются только по мере необходимости для разрыва циклов ссылок в [циклическом изолированном фрагменте](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate), но в будущих версиях объекты могут очищаться регулярно перед уничтожением.11111112В совокупности все функции [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) в системе должны совместно разрывать все циклы ссылок. Это тонкий момент, и если есть сомнения, предоставьте функцию `tp_clear`. Например, тип tuple не реализует функцию `tp_clear`, потому что можно доказать, что ни один цикл ссылок не может полностью состоять из кортежей. Поэтому функции `tp_clear` других типов отвечают за разрыв любого цикла, содержащего кортеж. Это не сразу очевидно, и редко есть веская причина избегать реализации `tp_clear`.11131114Реализации [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) должны удалять ссылки экземпляра на те его члены, которые могут являться объектами Python, и устанавливать указатели на эти члены в `NULL`, как показано в следующем примере:11151116```c1117static int1118local_clear(PyObject *op)1119{1120 localobject *self = (localobject *) op;1121 Py_CLEAR(self->key);1122 Py_CLEAR(self->args);1123 Py_CLEAR(self->kw);1124 Py_CLEAR(self->dict);1125 return 0;1126}1127```11281129Следует использовать макрос [`Py_CLEAR()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_CLEAR), потому что очистка ссылок – это деликатная операция: ссылка на содержащийся объект не должна освобождаться (через [`Py_DECREF()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_DECREF)) до тех пор, пока указатель на содержащийся объект не будет установлен в `NULL`. Это связано с тем, что освобождение ссылки может привести к тому, что содержащийся объект станет мусором, что вызовет цепочку действий по его утилизации, которая может включать выполнение произвольного кода Python (из-за финализаторов или колбэков слабых ссылок, связанных с содержащимся объектом). Если такой код может снова сослаться на *self*, важно, чтобы указатель на содержащийся объект в этот момент был `NULL`, чтобы *self* знал, что содержащийся объект больше нельзя использовать. Макрос `Py_CLEAR()` выполняет операции в безопасном порядке.11301131Если бит [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) установлен в поле [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags), функция очистки должна вызвать [`PyObject_ClearManagedDict()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_ClearManagedDict) следующим образом:11321133```c1134PyObject_ClearManagedDict((PyObject*)self);1135```11361137Дополнительную информацию о схеме сборки мусора Python можно найти в разделе [Поддержка циклической сборки мусора](https://python-all.ru/3.16/c-api/gcsupport.html#supporting-cycle-detection).11381139**Наследование:**11401141Группа: [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse), [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)11421143Это поле наследуется подтипами вместе с [`tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse) и флагом [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC): флаг, `tp_traverse` и [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear) наследуются от базового типа, если они равны нулю в подтипе.11441145> **См. также**1146>1147> [Жизненный цикл объекта](https://python-all.ru/3.16/c-api/lifecycle.html#life-cycle) – подробнее о том, как этот слот связан с другими слотами.11481149#### `richcmpfunc PyTypeObject.tp_richcompare`11501151*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_richcompare` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*11521153Необязательный указатель на функцию расширенного сравнения, сигнатура которой:11541155```c1156PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);1157```11581159Первый параметр гарантированно является экземпляром типа, определяемого через [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject).11601161Функция должна возвращать результат сравнения (обычно `Py_True` или `Py_False`). Если сравнение не определено, она должна вернуть `Py_NotImplemented`; если произошла другая ошибка, она должна вернуть `NULL` и установить условие исключения.11621163Следующие константы определены для использования в качестве третьего аргумента для [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) и для [`PyObject_RichCompare()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_RichCompare):11641165| Константа | Сравнение |1166| --- | --- |1167| Py\_LT | `<` |1168| Py\_LE | `<=` |1169| Py\_EQ | `==` |1170| Py\_NE | `!=` |1171| Py\_GT | `>` |1172| Py\_GE | `>=` |11731174Для упрощения написания функций расширенного сравнения определён следующий макрос:11751176#### `Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, op)`11771178Возвращает `Py_True` или `Py_False` из функции в зависимости от результата сравнения. VAL\_A и VAL\_B должны быть упорядочиваемыми с помощью операторов сравнения языка C (например, это могут быть значения типа int или float). Третий аргумент задаёт требуемую операцию, как и для [`PyObject_RichCompare()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_RichCompare).11791180Возвращаемое значение – это новая [сильная ссылка](https://python-all.ru/3.16/glossary.html#term-strong-reference).11811182В случае ошибки устанавливает исключение и возвращает `NULL` из функции.11831184Добавлено в версии 3.7.11851186**Наследование:**11871188Группа: [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash), [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare)11891190Это поле наследуется подтипами вместе с [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash): подтип наследует [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare) и `tp_hash`, когда `tp_richcompare` и `tp_hash` подтипа оба `NULL`.11911192**По умолчанию:**11931194[`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type) предоставляет реализацию [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare), которая может быть унаследована. Однако, если определено только [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash), унаследованная функция не используется, и экземпляры типа не смогут участвовать в сравнениях.11951196#### `Py_ssize_t PyTypeObject.tp_weaklistoffset`11971198Хотя это поле всё ещё поддерживается, [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) следует использовать вместо него, если это возможно.11991200Если экземпляры этого типа поддерживают слабые ссылки, это поле больше нуля и содержит смещение в структуре экземпляра до головы списка слабых ссылок (игнорируя заголовок GC, если он присутствует); это смещение используется функциями [`PyObject_ClearWeakRefs()`](https://python-all.ru/3.16/c-api/weakref.html#c.PyObject_ClearWeakRefs) и `PyWeakref_*`. Структура экземпляра должна содержать поле типа [PyObject](https://python-all.ru/3.16/c-api/structures.html#c.PyObject)\*, которое инициализируется `NULL`.12011202Не путайте это поле с [`tp_weaklist`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklist); это голова списка для слабых ссылок на сам объект типа.12031204Установка одновременно бита [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) и [`tp_weaklistoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) является ошибкой.12051206**Наследование:**12071208Это поле наследуется подтипами, но см. правила ниже. Подтип может переопределить это смещение; это означает, что подтип использует другую голову списка слабых ссылок, нежели базовый тип. Поскольку голова списка всегда находится через [`tp_weaklistoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset), это не должно быть проблемой.12091210**По умолчанию:**12111212Если бит [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) установлен в поле [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags), то [`tp_weaklistoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) будет установлено в отрицательное значение, чтобы указать, что использовать это поле небезопасно.12131214#### `getiterfunc PyTypeObject.tp_iter`12151216*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_iter` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*12171218Необязательный указатель на функцию, возвращающую [итератор](https://python-all.ru/3.16/glossary.html#term-iterator) для объекта. Его наличие обычно означает, что экземпляры этого типа являются [итерируемыми](https://python-all.ru/3.16/glossary.html#term-iterable) (хотя последовательности могут быть итерируемыми и без этой функции).12191220Эта функция имеет ту же сигнатуру, что и [`PyObject_GetIter()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetIter):12211222```c1223PyObject *tp_iter(PyObject *self);1224```12251226**Наследование:**12271228Это поле наследуется подтипами.12291230#### `iternextfunc PyTypeObject.tp_iternext`12311232*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_iternext` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*12331234Необязательный указатель на функцию, возвращающую следующий элемент [итератора](https://python-all.ru/3.16/glossary.html#term-iterator). Сигнатура:12351236```c1237PyObject *tp_iternext(PyObject *self);1238```12391240Когда итератор исчерпан, он должен возвращать `NULL`; исключение [`StopIteration`](https://python-all.ru/3.16/library/exceptions.html#StopIteration) может быть установлено или нет. При другой ошибке он также должен возвращать `NULL`. Его наличие означает, что экземпляры этого типа являются итераторами.12411242Типы-итераторы также должны определять функцию [`tp_iter`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_iter), и эта функция должна возвращать сам экземпляр итератора (не новый экземпляр итератора).12431244Эта функция имеет ту же сигнатуру, что и [`PyIter_Next()`](https://python-all.ru/3.16/c-api/iter.html#c.PyIter_Next).12451246**Наследование:**12471248Это поле наследуется подтипами.12491250#### `struct PyMethodDef *PyTypeObject.tp_methods`12511252*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_methods` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*12531254Необязательный указатель на статический массив структур [`PyMethodDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyMethodDef), завершающийся `NULL`, объявляющий обычные методы этого типа.12551256Для каждой записи в массиве в словарь типа добавляется запись (см. [`tp_dict`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dict) ниже), содержащая дескриптор метода.12571258**Наследование:**12591260Это поле не наследуется подтипами (методы наследуются через другой механизм).12611262#### `struct PyMemberDef *PyTypeObject.tp_members`12631264*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_members` входит в состав [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*12651266Необязательный указатель на статический массив [`PyMemberDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyMemberDef) структур, завершающийся `NULL`, объявляющий обычные элементы данных (поля или слоты) экземпляров этого типа.12671268Для каждой записи в массиве в словарь типа добавляется запись, содержащая дескриптор члена (см. [`tp_dict`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dict) ниже).12691270**Наследование:**12711272Это поле не наследуется подтипами (члены наследуются через другой механизм).12731274#### `struct PyGetSetDef *PyTypeObject.tp_getset`12751276*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_getset` входит в состав [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*12771278Необязательный указатель на статический массив [`PyGetSetDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyGetSetDef) структур, завершающийся `NULL`, объявляющий вычисляемые атрибуты экземпляров этого типа.12791280Для каждой записи в массиве в словарь типа добавляется запись, содержащая дескриптор getset (см. [`tp_dict`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dict) ниже).12811282**Наследование:**12831284Это поле не наследуется подтипами (вычисляемые атрибуты наследуются через другой механизм).12851286#### `PyTypeObject *PyTypeObject.tp_base`12871288Необязательный указатель на базовый тип, от которого наследуются свойства типа. На этом уровне поддерживается только одиночное наследование; множественное наследование требует динамического создания объекта типа вызовом метатипа.12891290Для соответствующего идентификатора слота см. [`Py_tp_base`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_base).12911292> **Примечание**1293>1294> Инициализация слотов подчиняется правилам инициализации глобальных переменных. C99 требует, чтобы инициализаторы были «адресными константами». Обозначения функций, такие как [`PyType_GenericNew()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericNew), с неявным преобразованием в указатель, являются допустимыми адресными константами C99.1295>1296> Однако унарный оператор '&', применённый к нестатической переменной, такой как [`PyBaseObject_Type`](https://python-all.ru/3.16/c-api/structures.html#c.PyBaseObject_Type), не обязан давать адресную константу. Компиляторы могут это поддерживать (gcc поддерживает), MSVC – нет. Оба компилятора в этом конкретном поведении строго соответствуют стандарту.1297>1298> Следовательно, [`tp_base`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_base) должно устанавливаться в функции инициализации модуля расширения.12991300**Наследование:**13011302Это поле не наследуется подтипами (очевидно).13031304**По умолчанию:**13051306По умолчанию это поле равно `&PyBaseObject_Type` (которое программистам Python известно как тип [`object`](https://python-all.ru/3.16/library/functions.html#object)).13071308#### `PyObject *PyTypeObject.tp_dict`13091310Словарь типа сохраняется здесь с помощью [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready).13111312Обычно это поле должно быть инициализировано значением `NULL` перед вызовом PyType\_Ready; оно также может быть инициализировано словарём, содержащим начальные атрибуты типа. После того как [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) инициализировал тип, в этот словарь можно добавлять дополнительные атрибуты только в том случае, если они не соответствуют перегруженным операциям (например, [`__add__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__add__)). После завершения инициализации типа это поле должно считаться доступным только для чтения.13131314Некоторые типы могут не хранить свой словарь в этом слоте. Используйте [`PyType_GetDict()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GetDict) для получения словаря для произвольного типа.13151316Изменено в версии 3.12: Детали реализации: для статических встроенных типов это всегда `NULL`. Вместо этого словарь для таких типов хранится в `PyInterpreterState`. Используйте [`PyType_GetDict()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GetDict) для получения словаря для произвольного типа.13171318**Наследование:**13191320Это поле не наследуется подтипами (хотя определённые здесь атрибуты наследуются через другой механизм).13211322**По умолчанию:**13231324Если это поле равно `NULL`, [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) назначит ему новый словарь.13251326> **Предупреждение**1327>1328> Небезопасно использовать [`PyDict_SetItem()`](https://python-all.ru/3.16/c-api/dict.html#c.PyDict_SetItem) на или иным образом изменять [`tp_dict`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dict) с помощью C-API словаря.13291330#### `descrgetfunc PyTypeObject.tp_descr_get`13311332*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_descr_get` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*13331334Необязательный указатель на функцию «descriptor get».13351336Сигнатура функции:13371338```c1339PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);1340```13411342**Наследование:**13431344Это поле наследуется подтипами.13451346#### `descrsetfunc PyTypeObject.tp_descr_set`13471348*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_descr_set` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*13491350Необязательный указатель на функцию для установки и удаления значения дескриптора.13511352Сигнатура функции:13531354```c1355int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);1356```13571358Аргумент *value* устанавливается в `NULL` для удаления значения.13591360**Наследование:**13611362Это поле наследуется подтипами.13631364#### `Py_ssize_t PyTypeObject.tp_dictoffset`13651366Хотя это поле всё ещё поддерживается, следует использовать [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) вместо него, если это возможно.13671368Если экземпляры этого типа имеют словарь, содержащий переменные экземпляра, это поле не равно нулю и содержит смещение в структуре экземпляра для словаря переменных экземпляра; это смещение используется [`PyObject_GenericGetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GenericGetAttr).13691370Не путайте это поле с [`tp_dict`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dict); это словарь для атрибутов самого объекта типа.13711372Значение задаёт смещение словаря относительно начала структуры экземпляра.13731374[`tp_dictoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) следует рассматривать как доступный только для записи. Чтобы получить указатель на словарь, вызовите [`PyObject_GenericGetDict()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GenericGetDict). Вызов `PyObject_GenericGetDict()` может потребовать выделения памяти для словаря, поэтому может быть эффективнее вызвать [`PyObject_GetAttr()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetAttr) при доступе к атрибуту объекта.13751376Установка обоих битов [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) и [`tp_dictoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) является ошибкой.13771378**Наследование:**13791380Это поле наследуется подтипами. Подтип не должен переопределять это смещение; это может быть небезопасно, если код C попытается получить доступ к словарю по предыдущему смещению. Для корректной поддержки наследования используйте [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT).13811382**По умолчанию:**13831384Этот слот не имеет значения по умолчанию. Для [статических типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types), если поле равно `NULL`, то для экземпляров не создаётся [`__dict__`](https://python-all.ru/3.16/reference/datamodel.html#object.__dict__).13851386Если в поле [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags) установлен бит [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT), то [`tp_dictoffset`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) будет установлено в `-1`, чтобы указать, что использовать это поле небезопасно.13871388#### `initproc PyTypeObject.tp_init`13891390*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_init` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*13911392Необязательный указатель на функцию инициализации экземпляра.13931394Эта функция соответствует методу [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__) классов. Как и `__init__()`, можно создать экземпляр без вызова `__init__()`, и можно переинициализировать экземпляр, вызвав его метод `__init__()` ещё раз.13951396Сигнатура функции:13971398```c1399int tp_init(PyObject *self, PyObject *args, PyObject *kwds);1400```14011402Аргумент self – это инициализируемый экземпляр; аргументы *args* и *kwds* представляют позиционные и именованные аргументы вызова [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__).14031404Функция [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init), если она не `NULL`, вызывается при обычном создании экземпляра через вызов его типа, после того как функция [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) типа вернула экземпляр этого типа. Если функция `tp_new` возвращает экземпляр другого типа, не являющегося подтипом исходного, функция `tp_init` не вызывается; если `tp_new` возвращает экземпляр подтипа исходного типа, вызывается `tp_init` подтипа.14051406Возвращает `0` при успехе, `-1` и устанавливает исключение при ошибке.14071408**Наследование:**14091410Это поле наследуется подтипами.14111412**По умолчанию:**14131414Для [статических типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types) это поле не имеет значения по умолчанию.14151416#### `allocfunc PyTypeObject.tp_alloc`14171418*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_alloc` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*14191420Необязательный указатель на функцию выделения экземпляра.14211422Сигнатура функции:14231424```c1425PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);1426```14271428**Наследование:**14291430Статические подтипы наследуют этот слот, который будет [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc), если унаследован от [`object`](https://python-all.ru/3.16/library/functions.html#object).14311432[Динамические подтипы](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) не наследуют этот слот.14331434**По умолчанию:**14351436Для динамических подтипов это поле всегда установлено в [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc).14371438Для статических подтипов этот слот наследуется (см. выше).14391440#### `newfunc PyTypeObject.tp_new`14411442*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_new` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*14431444Необязательный указатель на функцию создания экземпляра.14451446Сигнатура функции:14471448```c1449PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);1450```14511452Аргумент *subtype* – это тип создаваемого объекта; аргументы *args* и *kwds* представляют позиционные и ключевые аргументы вызова типа. Обратите внимание, что *subtype* не обязан совпадать с типом, чья функция [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) вызывается; это может быть подтип этого типа (но не произвольный тип).14531454Функция [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) должна вызывать `subtype->tp_alloc(subtype, nitems)` для выделения памяти под объект, а затем выполнять лишь минимально необходимую инициализацию. Инициализацию, которую можно безопасно пропустить или повторить, следует помещать в обработчик [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init). Хорошее эмпирическое правило: для неизменяемых типов вся инициализация должна выполняться в `tp_new`, а для изменяемых типов большую часть инициализации лучше отложить до `tp_init`.14551456Флаг [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION) используется для запрета создания экземпляров типа в Python.14571458**Наследование:**14591460Это поле наследуется подтипами, за исключением [статических типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types), у которых [`tp_base`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_base) равно `NULL` или `&PyBaseObject_Type`.14611462**По умолчанию:**14631464Для [статических типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types) это поле не имеет значения по умолчанию. Это означает, что если слот определён как `NULL`, тип нельзя вызвать для создания новых экземпляров; предположительно, существует другой способ создания экземпляров, например фабричная функция.14651466#### `freefunc PyTypeObject.tp_free`14671468*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_free` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*14691470Необязательный указатель на функцию освобождения экземпляра. Её сигнатура:14711472```c1473void tp_free(void *self);1474```14751476Эта функция должна освобождать память, выделенную [`tp_alloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_alloc).14771478**Наследование:**14791480Статические подтипы наследуют этот слот, который будет равен [`PyObject_Free()`](https://python-all.ru/3.16/c-api/memory.html#c.PyObject_Free), если унаследован от [`object`](https://python-all.ru/3.16/library/functions.html#object). Исключение: если тип поддерживает сборку мусора (т.е. флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) установлен в [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags)) и он бы унаследовал `PyObject_Free()`, то этот слот не наследуется, а по умолчанию принимает значение [`PyObject_GC_Del()`](https://python-all.ru/3.16/c-api/gcsupport.html#c.PyObject_GC_Del).14811482[Подтипы кучи](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) не наследуют этот слот.14831484**По умолчанию:**14851486Для [подтипов кучи](https://python-all.ru/3.16/c-api/typeobj.html#heap-types) этот слот по умолчанию использует деаллокатор, подходящий под [`PyType_GenericAlloc()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GenericAlloc) и значение флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).14871488Для статических подтипов этот слот наследуется (см. выше).14891490#### `inquiry PyTypeObject.tp_is_gc`14911492*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_is_gc` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*14931494Необязательный указатель на функцию, вызываемую сборщиком мусора.14951496Сборщику мусора необходимо знать, можно ли собрать конкретный объект или нет. Обычно достаточно посмотреть на поле [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags) типа объекта и проверить бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC). Но некоторые типы содержат как статически, так и динамически выделенные экземпляры, и статически выделенные экземпляры не подлежат сборке. Такие типы должны определять эту функцию; она должна возвращать `1` для собираемого экземпляра и `0` для несобираемого. Сигнатура:14971498```c1499int tp_is_gc(PyObject *self);1500```15011502(Единственный пример этого – сами типы. Метакласс, [`PyType_Type`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Type), определяет эту функцию, чтобы различать статически и [динамически выделенные типы](https://python-all.ru/3.16/c-api/typeobj.html#heap-types).)15031504**Наследование:**15051506Это поле наследуется подтипами.15071508**По умолчанию:**15091510У этого слота нет значения по умолчанию. Если это поле равно `NULL`, то в качестве функционального эквивалента используется [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).15111512#### `PyObject *PyTypeObject.tp_bases`15131514Кортеж базовых типов.15151516Это поле должно быть установлено в `NULL` и считаться доступным только для чтения. Python заполнит его, когда тип будет [`initialized`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready).15171518Соответствующий идентификатор слота см. в [`Py_tp_bases`](https://python-all.ru/3.16/c-api/type.html#c.Py_tp_bases).15191520> **Предупреждение**1521>1522> Множественное наследование плохо работает для статически определённых типов. Если установить `tp_bases` в кортеж, Python не вызовет ошибку, но некоторые слоты будут унаследованы только от первого базового класса.15231524**Наследование:**15251526Это поле не наследуется.15271528#### `PyObject *PyTypeObject.tp_mro`15291530Кортеж, содержащий расширенный набор базовых типов, начиная с самого типа и заканчивая [`object`](https://python-all.ru/3.16/library/functions.html#object), в порядке разрешения методов (MRO).15311532Это поле должно быть установлено в `NULL` и считаться доступным только для чтения. Python заполнит его, когда тип будет [`initialized`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready).15331534**Наследование:**15351536Это поле не наследуется; оно вычисляется заново с помощью [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready).15371538#### `PyObject *PyTypeObject.tp_cache`15391540Не используется. Только для внутреннего использования.15411542**Наследование:**15431544Это поле не наследуется.15451546#### `void *PyTypeObject.tp_subclasses`15471548Коллекция подклассов. Только для внутреннего использования. Может быть недопустимым указателем.15491550Чтобы получить список подклассов, вызовите метод Python [`__subclasses__()`](https://python-all.ru/3.16/reference/datamodel.html#type.__subclasses__).15511552Изменено в версии 3.12: Для некоторых типов это поле не содержит допустимый [PyObject](https://python-all.ru/3.16/c-api/structures.html#c.PyObject)\*. Тип был изменён на void\*, чтобы указать на это.15531554**Наследование:**15551556Это поле не наследуется.15571558#### `PyObject *PyTypeObject.tp_weaklist`15591560Голова списка слабых ссылок для слабых ссылок на этот объект типа. Не наследуется. Только для внутреннего использования.15611562Изменено в версии 3.12: Деталь внутренней реализации: для статических встроенных типов это всегда `NULL`, даже если добавлены слабые ссылки. Вместо этого слабые ссылки для каждого хранятся в `PyInterpreterState`. Используйте публичный C-API или внутренний макрос `_PyObject_GET_WEAKREFS_LISTPTR()`, чтобы избежать этого различия.15631564**Наследование:**15651566Это поле не наследуется.15671568#### `destructor PyTypeObject.tp_del`15691570*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_del` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*15711572Это поле устарело. Используйте [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize) вместо него.15731574#### `unsigned int PyTypeObject.tp_version_tag`15751576Используется для индексации кэша методов. Только для внутреннего использования.15771578**Наследование:**15791580Это поле не наследуется.15811582#### `destructor PyTypeObject.tp_finalize`15831584*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_finalize` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.5.*15851586Необязательный указатель на функцию финализации экземпляра. Это C-реализация специального метода [`__del__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__del__). Его сигнатура:15871588```c1589void tp_finalize(PyObject *self);1590```15911592Основная цель финализации – выполнить любую нетривиальную очистку, которая должна быть выполнена перед уничтожением объекта, пока объект и любые другие объекты, на которые он прямо или косвенно ссылается, всё ещё находятся в согласованном состоянии. Финализатору разрешено выполнять произвольный код Python.15931594Перед тем как Python автоматически финализирует объект, некоторые из его прямых или косвенных референтов могли уже быть автоматически финализированы. Однако ни один из референтов ещё не будет автоматически очищен ([`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)).15951596Другие нефинализированные объекты всё ещё могут использовать финализированный объект, поэтому финализатор должен оставить объект в разумном состоянии (например, инварианты всё ещё выполняются).15971598> **Примечание**1599>1600> После того как Python автоматически финализирует объект, Python может начать автоматически очищать ([`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)) объект и его референты (прямые и косвенные). Очищенные объекты не гарантированно находятся в согласованном состоянии; финализированный объект должен уметь переносить очищенные референты.16011602> **Примечание**1603>1604> Объект не гарантированно будет автоматически финализирован до вызова его деструктора ([`tp_dealloc`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)). Рекомендуется вызывать [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc) в начале `tp_dealloc`, чтобы гарантировать, что объект всегда финализируется перед уничтожением.16051606> **Примечание**1607>1608> Функцию [`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize) можно вызывать из любого потока, хотя [GIL](https://python-all.ru/3.16/glossary.html#term-GIL) будет удерживаться.16091610> **Примечание**1611>1612> Функцию `tp_finalize` можно вызывать во время завершения работы, после удаления некоторых глобальных переменных. Подробнее см. документацию метода [`__del__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__del__).16131614Когда Python финализирует объект, он ведёт себя как следующий алгоритм:161516161. Python может пометить объект как *финализированный*. В настоящее время Python всегда помечает объекты, чей тип поддерживает сборку мусора (т.е. флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) установлен в [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags)), и никогда не помечает объекты других типов; это может измениться в будущей версии.16172. Если объект не помечен как *финализированный* и его функция финализатора `tp_finalize` не равна `NULL`, то функция финализатора вызывается.16183. Если функция финализатора была вызвана и финализатор сделал объект достижимым (т.е. есть ссылка на объект и он не является членом [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate)), то считается, что финализатор *воскресил* объект. Не определено, может ли финализатор также воскресить объект, добавив новую ссылку на объект, которая не делает его достижимым, т.е. объект (всё ещё) является членом циклического изолята.16194. Если финализатор воскресил объект, ожидаемое уничтожение объекта отменяется, и пометка *финализированный* объекта может быть удалена, если она присутствует. В настоящее время Python никогда не удаляет пометку *финализированный*; это может измениться в будущей версии.16201621*Автоматическая финализация* относится к любой финализации, выполняемой Python, кроме случаев вызова [`PyObject_CallFinalizer()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizer) или [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc). Не даётся никаких гарантий относительно того, когда, если вообще, или как часто объект автоматически финализируется, за исключением:16221623- Python не будет автоматически финализировать объект, если он достижим, то есть на него есть ссылка и он не является членом [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate).1624- Python не будет автоматически финализировать объект, если финализация не пометит объект как *финализированный*. В настоящее время это относится к объектам, тип которых не поддерживает сборку мусора, то есть флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) не установлен. Такие объекты можно вручную финализировать, вызвав [`PyObject_CallFinalizer()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizer) или [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc).1625- Python не будет автоматически финализировать одновременно любые два члена [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate).1626- Python не будет автоматически финализировать объект после его автоматической очистки ([`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)).1627- Если объект является членом [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate), Python не будет автоматически финализировать его после автоматической очистки (см. [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)) любого другого члена.1628- Python автоматически финализирует каждый член [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate) перед тем, как автоматически очистить (см. [`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)) любой из них.1629- Если Python собирается автоматически очистить объект ([`tp_clear`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_clear)), он сначала автоматически финализирует объект.16301631В настоящее время Python автоматически финализирует только объекты, являющиеся членами [циклического изолята](https://python-all.ru/3.16/glossary.html#term-cyclic-isolate), но будущие версии могут финализировать объекты регулярно перед их уничтожением.16321633Чтобы финализировать объект вручную, не вызывайте эту функцию напрямую; вместо этого вызывайте [`PyObject_CallFinalizer()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizer) или [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc).16341635[`tp_finalize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_finalize) должен оставлять текущее состояние исключения неизменным. Рекомендуемый способ написания нетривиального финализатора – сохранить исключение в начале, вызвав [`PyErr_GetRaisedException()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_GetRaisedException), и восстановить исключение в конце, вызвав [`PyErr_SetRaisedException()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_SetRaisedException). Если в середине финализатора возникло исключение, запишите его в журнал и очистите с помощью [`PyErr_WriteUnraisable()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_WriteUnraisable) или [`PyErr_FormatUnraisable()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_FormatUnraisable). Например:16361637```c1638static void1639foo_finalize(PyObject *self)1640{1641 // Сохранить текущее исключение, если оно есть.1642 PyObject *exc = PyErr_GetRaisedException();16431644 // ...16451646 if (do_something_that_might_raise() != success_indicator) {1647 PyErr_WriteUnraisable(self);1648 goto done;1649 }16501651done:1652 // Восстановить сохраненное исключение. При этом молча отбрасывается любое исключение,1653 // вызванное выше, поэтому обязательно вызовите PyErr_WriteUnraisable сначала, если1654 // необходимо.1655 PyErr_SetRaisedException(exc);1656}1657```16581659**Наследование:**16601661Это поле наследуется подтипами.16621663Добавлено в версии 3.4.16641665Изменено в версии 3.8: До версии 3.8 необходимо было установить бит флагов [`Py_TPFLAGS_HAVE_FINALIZE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_FINALIZE), чтобы это поле можно было использовать. Теперь это не требуется.16661667> **См. также**1668>1669> - [**PEP 442**](https://python-all.ru/3.16/c-api/typeobj.html): «Безопасная финализация объектов»1670> - [Жизненный цикл объекта](https://python-all.ru/3.16/c-api/lifecycle.html#life-cycle) для получения подробной информации о том, как этот слот соотносится с другими слотами.1671> - [`PyObject_CallFinalizer()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizer)1672> - [`PyObject_CallFinalizerFromDealloc()`](https://python-all.ru/3.16/c-api/lifecycle.html#c.PyObject_CallFinalizerFromDealloc)16731674#### `vectorcallfunc PyTypeObject.tp_vectorcall`16751676*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_tp_vectorcall` является частью [стабильного ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.14.*16771678[Функция vectorcall](https://python-all.ru/3.16/c-api/call.html#vectorcall) для вызова этого объекта типа (а не экземпляров). Другими словами, `tp_vectorcall` можно использовать для оптимизации `type.__call__`, которая обычно возвращает новый экземпляр *типа*.16791680Как и в случае с любой функцией vectorcall, если `tp_vectorcall` равно `NULL`, вместо него используется протокол *tp\_call* (`Py_TYPE(type)->tp_call`).16811682> **Примечание**1683>1684> [Протокол vectorcall](https://python-all.ru/3.16/c-api/call.html#vectorcall) требует, чтобы функция vectorcall имела то же поведение, что и соответствующая `tp_call`. Это означает, что `type->tp_vectorcall` должно соответствовать поведению `Py_TYPE(type)->tp_call`.1685>1686> В частности, если *type* использует метакласс по умолчанию, `type->tp_vectorcall` должен вести себя так же, как [PyType\_Type](https://python-all.ru/3.16/c-api/type.html#c.PyType_Type)-\>tp\_call, который:1687>1688> - вызывает `type->tp_new`,1689> - если результат является подклассом *type*, вызывает `type->tp_init` для результата `tp_new`, и1690> - возвращает результат `tp_new`.1691>1692> Обычно `tp_vectorcall` переопределяется для оптимизации этого процесса для конкретных [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new) и [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init). При выполнении этого для типов, допускающих создание подклассов пользователем, обратите внимание, что оба могут быть переопределены (с использованием [`__new__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__new__) и [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__) соответственно).16931694**Наследование:**16951696Это поле никогда не наследуется.16971698Добавлено в версии 3.9: (поле существует с версии 3.8, но используется только с версии 3.9)16991700#### `unsigned char PyTypeObject.tp_watched`17011702Внутреннее. Не использовать.17031704Добавлено в версии 3.12.17051706## Статические типы17071708Традиционно типы, определяемые в коде C, являются *статическими*, то есть статическая структура [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject) определяется непосредственно в коде и инициализируется с помощью [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready).17091710В результате получаются типы, которые ограничены по сравнению с типами, определёнными в Python.17111712- Статические типы ограничены одним базовым классом, то есть не могут использовать множественное наследование.1713- Объекты статических типов (но не обязательно их экземпляры) неизменяемы. Из Python невозможно добавить или изменить атрибуты объекта типа.1714- Объекты статических типов разделяются между [под-интерпретаторами](https://python-all.ru/3.16/c-api/subinterpreters.html#sub-interpreter-support), поэтому они не должны содержать состояние, специфичное для под-интерпретатора.17151716Кроме того, поскольку [`PyTypeObject`](https://python-all.ru/3.16/c-api/type.html#c.PyTypeObject) является лишь частью [Limited API](https://python-all.ru/3.16/c-api/stable.html#limited-c-api) в виде непрозрачной структуры, любые модули расширения, использующие статические типы, должны быть скомпилированы для конкретной минорной версии Python.17171718## Кучные типы17191720Альтернативой [статическим типам](https://python-all.ru/3.16/c-api/typeobj.html#static-types) являются *кучные типы (heap-allocated types)*, или *кучные типы (heap types)* для краткости. Они очень похожи на классы, создаваемые с помощью оператора `class`. У кучных типов установлен флаг [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE).17211722Для этого заполняется структура [`PyType_Spec`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Spec) и вызывается [`PyType_FromSpec()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromSpec), [`PyType_FromSpecWithBases()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromSpecWithBases), [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromModuleAndSpec) или [`PyType_FromMetaclass()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_FromMetaclass).17231724## Структуры числовых объектов17251726#### `type PyNumberMethods`17271728Эта структура содержит указатели на функции, которые объект использует для реализации числового протокола. Каждая функция используется одноимённой функцией, описанной в разделе [Числовой протокол](https://python-all.ru/3.16/c-api/number.html#number).17291730Вот определение структуры:17311732```c1733typedef struct {1734 binaryfunc nb_add;1735 binaryfunc nb_subtract;1736 binaryfunc nb_multiply;1737 binaryfunc nb_remainder;1738 binaryfunc nb_divmod;1739 ternaryfunc nb_power;1740 unaryfunc nb_negative;1741 unaryfunc nb_positive;1742 unaryfunc nb_absolute;1743 inquiry nb_bool;1744 unaryfunc nb_invert;1745 binaryfunc nb_lshift;1746 binaryfunc nb_rshift;1747 binaryfunc nb_and;1748 binaryfunc nb_xor;1749 binaryfunc nb_or;1750 unaryfunc nb_int;1751 void *nb_reserved;1752 unaryfunc nb_float;17531754 binaryfunc nb_inplace_add;1755 binaryfunc nb_inplace_subtract;1756 binaryfunc nb_inplace_multiply;1757 binaryfunc nb_inplace_remainder;1758 ternaryfunc nb_inplace_power;1759 binaryfunc nb_inplace_lshift;1760 binaryfunc nb_inplace_rshift;1761 binaryfunc nb_inplace_and;1762 binaryfunc nb_inplace_xor;1763 binaryfunc nb_inplace_or;17641765 binaryfunc nb_floor_divide;1766 binaryfunc nb_true_divide;1767 binaryfunc nb_inplace_floor_divide;1768 binaryfunc nb_inplace_true_divide;17691770 unaryfunc nb_index;17711772 binaryfunc nb_matrix_multiply;1773 binaryfunc nb_inplace_matrix_multiply;1774} PyNumberMethods;1775```17761777> **Примечание**1778>1779> Бинарные и тернарные функции должны проверять тип всех своих операндов и выполнять необходимые преобразования (хотя бы один из операндов должен быть экземпляром определяемого типа). Если операция не определена для данных операндов, бинарные и тернарные функции должны вернуть `Py_NotImplemented`; если произошла другая ошибка, они должны вернуть `NULL` и установить исключение.17801781> **Примечание**1782>1783> Поле [`nb_reserved`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_reserved) всегда должно быть `NULL`. Ранее оно называлось `nb_long` и было переименовано в Python 3.0.1.17841785#### `binaryfunc PyNumberMethods.nb_add`17861787*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_add` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*17881789#### `binaryfunc PyNumberMethods.nb_subtract`17901791*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_subtract` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*17921793#### `binaryfunc PyNumberMethods.nb_multiply`17941795*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_multiply` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*17961797#### `binaryfunc PyNumberMethods.nb_remainder`17981799*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_remainder` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18001801#### `binaryfunc PyNumberMethods.nb_divmod`18021803*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_divmod` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18041805#### `ternaryfunc PyNumberMethods.nb_power`18061807*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_power` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18081809#### `unaryfunc PyNumberMethods.nb_negative`18101811*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_negative` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18121813#### `unaryfunc PyNumberMethods.nb_positive`18141815*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_positive` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18161817#### `unaryfunc PyNumberMethods.nb_absolute`18181819*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_absolute` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18201821#### `inquiry PyNumberMethods.nb_bool`18221823*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_bool` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18241825#### `unaryfunc PyNumberMethods.nb_invert`18261827*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_invert` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18281829#### `binaryfunc PyNumberMethods.nb_lshift`18301831*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_lshift` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18321833#### `binaryfunc PyNumberMethods.nb_rshift`18341835*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_rshift` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18361837#### `binaryfunc PyNumberMethods.nb_and`18381839*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_and` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18401841#### `binaryfunc PyNumberMethods.nb_xor`18421843*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_xor` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18441845#### `binaryfunc PyNumberMethods.nb_or`18461847*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_or` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18481849#### `unaryfunc PyNumberMethods.nb_int`18501851*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_int` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18521853#### `void *PyNumberMethods.nb_reserved`18541855#### `unaryfunc PyNumberMethods.nb_float`18561857*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_float` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18581859#### `binaryfunc PyNumberMethods.nb_inplace_add`18601861*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_add` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18621863#### `binaryfunc PyNumberMethods.nb_inplace_subtract`18641865*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_subtract` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18661867#### `binaryfunc PyNumberMethods.nb_inplace_multiply`18681869*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_multiply` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18701871#### `binaryfunc PyNumberMethods.nb_inplace_remainder`18721873*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_remainder` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18741875#### `ternaryfunc PyNumberMethods.nb_inplace_power`18761877*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_power` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18781879#### `binaryfunc PyNumberMethods.nb_inplace_lshift`18801881*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_lshift` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18821883#### `binaryfunc PyNumberMethods.nb_inplace_rshift`18841885*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_rshift` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18861887#### `binaryfunc PyNumberMethods.nb_inplace_and`18881889*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_and` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18901891#### `binaryfunc PyNumberMethods.nb_inplace_xor`18921893*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_xor` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18941895#### `binaryfunc PyNumberMethods.nb_inplace_or`18961897*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_or` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*18981899#### `binaryfunc PyNumberMethods.nb_floor_divide`19001901*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_floor_divide` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19021903#### `binaryfunc PyNumberMethods.nb_true_divide`19041905*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_true_divide` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19061907#### `binaryfunc PyNumberMethods.nb_inplace_floor_divide`19081909*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_floor_divide` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19101911#### `binaryfunc PyNumberMethods.nb_inplace_true_divide`19121913*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_true_divide` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19141915#### `unaryfunc PyNumberMethods.nb_index`19161917*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_index` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19181919#### `binaryfunc PyNumberMethods.nb_matrix_multiply`19201921*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_matrix_multiply` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.5.*19221923#### `binaryfunc PyNumberMethods.nb_inplace_matrix_multiply`19241925*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_nb_inplace_matrix_multiply` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.5.*19261927## Структуры объектов отображения19281929#### `type PyMappingMethods`19301931Эта структура хранит указатели на функции, которые объект использует для реализации протокола отображения. Она содержит три члена:19321933#### `lenfunc PyMappingMethods.mp_length`19341935*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_mp_length` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19361937Эта функция используется [`PyMapping_Size()`](https://python-all.ru/3.16/c-api/mapping.html#c.PyMapping_Size) и [`PyObject_Size()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Size) и имеет ту же сигнатуру. Этот слот может быть установлен в `NULL`, если у объекта нет определённой длины.19381939#### `binaryfunc PyMappingMethods.mp_subscript`19401941*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_mp_subscript` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19421943Эта функция используется [`PyObject_GetItem()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetItem) и [`PySequence_GetSlice()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_GetSlice) и имеет ту же сигнатуру, что и `PyObject_GetItem()`. Этот слот должен быть заполнен, чтобы функция [`PyMapping_Check()`](https://python-all.ru/3.16/c-api/mapping.html#c.PyMapping_Check) возвращала `1`; в противном случае он может быть `NULL` .19441945#### `objobjargproc PyMappingMethods.mp_ass_subscript`19461947*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_mp_ass_subscript` входит в состав [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19481949Эта функция используется [`PyObject_SetItem()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_SetItem), [`PyObject_DelItem()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_DelItem), [`PySequence_SetSlice()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_SetSlice) и [`PySequence_DelSlice()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_DelSlice). У неё та же сигнатура, что и у `PyObject_SetItem()`, но *v* также может быть установлен в `NULL` для удаления элемента. Если этот слот равен `NULL`, объект не поддерживает присваивание и удаление элементов.19501951## Структуры объектов последовательностей19521953#### `type PySequenceMethods`19541955Эта структура содержит указатели на функции, которые объект использует для реализации протокола последовательности.19561957#### `lenfunc PySequenceMethods.sq_length`19581959*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_length` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19601961Эта функция используется [`PySequence_Size()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Size) и [`PyObject_Size()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Size) и имеет ту же сигнатуру. Она также используется для обработки отрицательных индексов через слоты [`sq_item`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_item) и [`sq_ass_item`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_ass_item).19621963#### `binaryfunc PySequenceMethods.sq_concat`19641965*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_concat` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19661967Эта функция используется [`PySequence_Concat()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Concat) и имеет ту же сигнатуру. Она также используется оператором `+` после попытки численного сложения через слот [`nb_add`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_add).19681969#### `ssizeargfunc PySequenceMethods.sq_repeat`19701971*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_repeat` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19721973Эта функция используется [`PySequence_Repeat()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Repeat) и имеет ту же сигнатуру. Она также используется оператором `*` после попытки численного умножения через слот [`nb_multiply`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_multiply).19741975#### `ssizeargfunc PySequenceMethods.sq_item`19761977*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_item` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19781979Эта функция используется [`PySequence_GetItem()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_GetItem) и имеет ту же сигнатуру. Она также используется [`PyObject_GetItem()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_GetItem) после попытки индексирования через слот [`mp_subscript`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyMappingMethods.mp_subscript). Этот слот должен быть заполнен, чтобы функция [`PySequence_Check()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Check) возвращала `1`; в противном случае он может быть `NULL`.19801981Отрицательные индексы обрабатываются следующим образом: если слот [`sq_length`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_length) заполнен, он вызывается, и длина последовательности используется для вычисления положительного индекса, который передаётся [`sq_item`](https://python-all.ru/3.16/c-api/typeobj.html#c.PySequenceMethods.sq_item). Если `sq_length` равно `NULL`, индекс передаётся функции как есть.19821983#### `ssizeobjargproc PySequenceMethods.sq_ass_item`19841985*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_ass_item` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19861987Эта функция используется [`PySequence_SetItem()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_SetItem) и имеет ту же сигнатуру. Она также используется [`PyObject_SetItem()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_SetItem) и [`PyObject_DelItem()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_DelItem) после попытки присваивания и удаления элемента через слот [`mp_ass_subscript`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyMappingMethods.mp_ass_subscript). Этот слот может быть оставлен равным `NULL`, если объект не поддерживает присваивание и удаление элементов.19881989#### `objobjproc PySequenceMethods.sq_contains`19901991*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_contains` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19921993Эта функция может использоваться [`PySequence_Contains()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Contains) и имеет ту же сигнатуру. Этот слот может быть оставлен равным `NULL`; в этом случае `PySequence_Contains()` просто проходит по последовательности, пока не найдёт совпадение.19941995#### `binaryfunc PySequenceMethods.sq_inplace_concat`19961997*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_inplace_concat` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*19981999Эта функция используется [`PySequence_InPlaceConcat()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_InPlaceConcat) и имеет ту же сигнатуру. Она должна изменить свой первый операнд и вернуть его. Этот слот может быть оставлен равным `NULL`; в этом случае `PySequence_InPlaceConcat()` будет использовать [`PySequence_Concat()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Concat) как запасной вариант. Она также используется расширенным присваиванием `+=` после попытки численного сложения на месте через слот [`nb_inplace_add`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_add).20002001#### `ssizeargfunc PySequenceMethods.sq_inplace_repeat`20022003*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_sq_inplace_repeat` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*20042005Эта функция используется [`PySequence_InPlaceRepeat()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_InPlaceRepeat) и имеет ту же сигнатуру. Она должна изменить свой первый операнд и вернуть его. Этот слот может быть оставлен равным `NULL`; в этом случае `PySequence_InPlaceRepeat()` будет использовать [`PySequence_Repeat()`](https://python-all.ru/3.16/c-api/sequence.html#c.PySequence_Repeat) как запасной вариант. Она также используется расширенным присваиванием `*=` после попытки численного умножения на месте через слот [`nb_inplace_multiply`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyNumberMethods.nb_inplace_multiply).20062007## Структуры объектов буфера20082009#### `type PyBufferProcs`20102011Эта структура содержит указатели на функции, необходимые для [протокола буфера](https://python-all.ru/3.16/c-api/buffer.html#bufferobjects). Протокол определяет, как объект-экспортёр может предоставлять свои внутренние данные объектам-потребителям.20122013#### `getbufferproc PyBufferProcs.bf_getbuffer`20142015*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_bf_getbuffer` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.11.*20162017Сигнатура этой функции:20182019```c2020int (PyObject *exporter, Py_buffer *view, int flags);2021```20222023Обрабатывает запрос к *экспортёру* на заполнение *представления* в соответствии с *флагами*. За исключением пункта (3), реализация этой функции ОБЯЗАНА выполнить следующие шаги:202420251. Проверить, можно ли удовлетворить запрос. Если нет, возбудить [`BufferError`](https://python-all.ru/3.16/library/exceptions.html#BufferError), установить `view->obj` в `NULL` и вернуть `-1`.20262. Заполнить запрошенные поля.20273. Увеличить внутренний счётчик числа экспортов.20284. Установить `view->obj` в *экспортёр* и увеличить `view->obj`.20295. Вернуть `0`.20302031**Потокобезопасность:**20322033В [сборке со свободными потоками](https://python-all.ru/3.16/glossary.html#term-free-threaded-build) реализации должны гарантировать:20342035- Увеличение счётчика экспортов на шаге (3) должно быть атомарным.2036- Лежащие в основе данные буфера остаются действительными и находятся в стабильной области памяти на всё время жизни всех экспортов.2037- Для объектов, поддерживающих изменение размера или перераспределение (например, [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray)), счётчик экспортов атомарно проверяется перед такими операциями, и если экспорты существуют, возбуждается [`BufferError`](https://python-all.ru/3.16/library/exceptions.html#BufferError).2038- Функцию безопасно вызывать одновременно из нескольких потоков.20392040См. также [Потокобезопасность объектов memoryview](https://python-all.ru/3.16/library/threadsafety.html#thread-safety-memoryview) для гарантий потокобезопасности на уровне Python для объектов [`memoryview`](https://python-all.ru/3.16/library/stdtypes.html#memoryview).20412042Если *экспортёр* является частью цепочки или дерева поставщиков буферов, можно использовать две основные схемы:20432044- Повторный экспорт: каждый элемент дерева выступает в роли экспортирующего объекта и устанавливает `view->obj` в новую ссылку на себя.2045- Перенаправление: запрос буфера перенаправляется корневому объекту дерева. Здесь `view->obj` будет новой ссылкой на корневой объект.20462047Отдельные поля *представления* описаны в разделе [Структура буфера](https://python-all.ru/3.16/c-api/buffer.html#buffer-structure), правила, как экспортёр должен реагировать на конкретные запросы – в разделе [Типы запросов буфера](https://python-all.ru/3.16/c-api/buffer.html#buffer-request-types).20482049Вся память, на которую указывает структура [`Py_buffer`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer), принадлежит экспортёру и должна оставаться действительной, пока есть хотя бы один потребитель. [`format`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer.format), [`shape`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer.shape), [`strides`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer.strides), [`suboffsets`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer.suboffsets) и [`internal`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer.internal) доступны потребителю только для чтения.20502051[`PyBuffer_FillInfo()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_FillInfo) предоставляет простой способ предоставления простого байтового буфера, корректно обрабатывая все типы запросов.20522053[`PyObject_GetBuffer()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyObject_GetBuffer) – это интерфейс для потребителя, который оборачивает эту функцию.20542055#### `releasebufferproc PyBufferProcs.bf_releasebuffer`20562057*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_bf_releasebuffer` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.11.*20582059Сигнатура этой функции:20602061```c2062void (PyObject *exporter, Py_buffer *view);2063```20642065Обрабатывает запрос на освобождение ресурсов буфера. Если никакие ресурсы освобождать не нужно, [`PyBufferProcs.bf_releasebuffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) может быть `NULL`. В противном случае стандартная реализация этой функции выполнит следующие необязательные шаги:206620671. Уменьшить внутренний счётчик числа экспортов.20682. Если счётчик равен `0`, освободить всю память, связанную с *представлением*.20692070**Потокобезопасность:**20712072В [сборке со свободными потоками](https://python-all.ru/3.16/glossary.html#term-free-threaded-build):20732074- Уменьшение счётчика экспортов на шаге (1) должно быть атомарным.2075- Очистка ресурсов при достижении счётчиком нуля должна выполняться атомарно, так как последнее освобождение может конкурировать с одновременными освобождениями из других потоков, и освобождение памяти должно произойти только один раз.20762077Экспортёр ОБЯЗАН использовать поле [`internal`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer.internal) для отслеживания ресурсов, специфичных для буфера. Гарантируется, что это поле остаётся постоянным, в то время как потребитель МОЖЕТ передавать копию исходного буфера в качестве аргумента *view*.20782079Эта функция НЕ ДОЛЖНА уменьшать `view->obj`, так как это делается автоматически в [`PyBuffer_Release()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_Release) (такая схема полезна для разрыва циклических ссылок).20802081[`PyBuffer_Release()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_Release) – это интерфейс для потребителя, который оборачивает эту функцию.20822083## Асинхронные структуры объектов20842085Добавлено в версии 3.5.20862087#### `type PyAsyncMethods`20882089Эта структура содержит указатели на функции, необходимые для реализации объектов [ожидаемый объект](https://python-all.ru/3.16/glossary.html#term-awaitable) и [асинхронный итератор](https://python-all.ru/3.16/glossary.html#term-asynchronous-iterator).20902091Вот определение структуры:20922093```c2094typedef struct {2095 unaryfunc am_await;2096 unaryfunc am_aiter;2097 unaryfunc am_anext;2098 sendfunc am_send;2099} PyAsyncMethods;2100```21012102#### `unaryfunc PyAsyncMethods.am_await`21032104*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_am_await` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.5.*21052106Сигнатура этой функции:21072108```c2109PyObject *am_await(PyObject *self);2110```21112112Возвращаемый объект должен быть [итератором](https://python-all.ru/3.16/glossary.html#term-iterator), т.е. [`PyIter_Check()`](https://python-all.ru/3.16/c-api/iter.html#c.PyIter_Check) должен возвращать `1` для него.21132114Этот слот может быть установлен в `NULL`, если объект не является [ожидаемым объектом](https://python-all.ru/3.16/glossary.html#term-awaitable).21152116#### `unaryfunc PyAsyncMethods.am_aiter`21172118*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_am_aiter` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.5.*21192120Сигнатура этой функции:21212122```c2123PyObject *am_aiter(PyObject *self);2124```21252126Должен возвращать объект [асинхронный итератор](https://python-all.ru/3.16/glossary.html#term-asynchronous-iterator). Подробнее см. [`__anext__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__anext__).21272128Этот слот может быть установлен в `NULL`, если объект не реализует протокол асинхронной итерации.21292130#### `unaryfunc PyAsyncMethods.am_anext`21312132*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_am_anext` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.5.*21332134Сигнатура этой функции:21352136```c2137PyObject *am_anext(PyObject *self);2138```21392140Должен возвращать объект [ожидаемый объект](https://python-all.ru/3.16/glossary.html#term-awaitable). Подробнее см. [`__anext__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__anext__). Этот слот может быть установлен в `NULL`.21412142#### `sendfunc PyAsyncMethods.am_send`21432144*Соответствующий [идентификатор слота](https://python-all.ru/3.16/c-api/type.html#c.PyType_Slot) `Py_am_send` является частью [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.10.*21452146Сигнатура этой функции:21472148```c2149PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);2150```21512152Подробнее см. [`PyIter_Send()`](https://python-all.ru/3.16/c-api/iter.html#c.PyIter_Send). Этот слот может быть установлен в `NULL`.21532154Добавлено в версии 3.10.21552156## Определения типов слотов21572158#### `typedef PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems)`21592160*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*21612162Назначение этой функции – разделить выделение памяти и её инициализацию. Она должна возвращать указатель на блок памяти достаточной длины для экземпляра, с подходящим выравниванием и обнулённый, но с [`ob_refcnt`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_refcnt), установленным в `1`, и [`ob_type`](https://python-all.ru/3.16/c-api/structures.html#c.PyObject.ob_type), установленным в аргумент типа. Если [`tp_itemsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) типа не равно нулю, поле [`ob_size`](https://python-all.ru/3.16/c-api/structures.html#c.PyVarObject.ob_size) объекта должно быть инициализировано значением *nitems*, а длина выделенного блока памяти должна быть `tp_basicsize + nitems*tp_itemsize`, округлённой до кратного `sizeof(void*)`; в противном случае *nitems* не используется, и длина блока должна быть [`tp_basicsize`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).21632164Эта функция не должна выполнять никакой другой инициализации экземпляра, включая выделение дополнительной памяти; это должно выполнять [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new).21652166#### `typedef void (*destructor)(PyObject*)`21672168*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*21692170#### `typedef void (*freefunc)(void*)`21712172См. [`tp_free`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_free).21732174#### `typedef PyObject *(*newfunc)(PyTypeObject*, PyObject*, PyObject*)`21752176*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*21772178См. [`tp_new`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_new).21792180#### `typedef int (*initproc)(PyObject*, PyObject*, PyObject*)`21812182*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*21832184См. [`tp_init`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_init).21852186#### `typedef PyObject *(*reprfunc)(PyObject*)`21872188*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*21892190См. [`tp_repr`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_repr).21912192#### `typedef PyObject *(*getattrfunc)(PyObject *self, char *attr)`21932194*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*21952196Возвращает значение именованного атрибута для объекта.21972198#### `typedef int (*setattrfunc)(PyObject *self, char *attr, PyObject *value)`21992200*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22012202Устанавливает значение именованного атрибута для объекта. Аргумент value устанавливается в `NULL` для удаления атрибута.22032204#### `typedef PyObject *(*getattrofunc)(PyObject *self, PyObject *attr)`22052206*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22072208Возвращает значение именованного атрибута для объекта.22092210См. [`tp_getattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_getattro).22112212#### `typedef int (*setattrofunc)(PyObject *self, PyObject *attr, PyObject *value)`22132214*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22152216Устанавливает значение именованного атрибута для объекта. Аргумент value устанавливается в `NULL` для удаления атрибута.22172218См. [`tp_setattro`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_setattro).22192220#### `typedef PyObject *(*descrgetfunc)(PyObject*, PyObject*, PyObject*)`22212222*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22232224См. [`tp_descr_get`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_descr_get).22252226#### `typedef int (*descrsetfunc)(PyObject*, PyObject*, PyObject*)`22272228*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22292230См. [`tp_descr_set`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_descr_set).22312232#### `typedef Py_hash_t (*hashfunc)(PyObject*)`22332234*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22352236См. [`tp_hash`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_hash).22372238#### `typedef PyObject *(*richcmpfunc)(PyObject*, PyObject*, int)`22392240*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22412242См. [`tp_richcompare`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_richcompare).22432244#### `typedef PyObject *(*getiterfunc)(PyObject*)`22452246*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22472248См. [`tp_iter`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_iter).22492250#### `typedef PyObject *(*iternextfunc)(PyObject*)`22512252*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22532254См. [`tp_iternext`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_iternext).22552256#### `typedef Py_ssize_t (*lenfunc)(PyObject*)`22572258*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22592260#### `typedef int (*getbufferproc)(PyObject*, Py_buffer*, int)`22612262*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.12.*22632264#### `typedef void (*releasebufferproc)(PyObject*, Py_buffer*)`22652266*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable) начиная с версии 3.12.*22672268#### `typedef PyObject *(*unaryfunc)(PyObject*)`22692270*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22712272#### `typedef PyObject *(*binaryfunc)(PyObject*, PyObject*)`22732274*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22752276#### `typedef PySendResult (*sendfunc)(PyObject*, PyObject*, PyObject**)`22772278См. [`am_send`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyAsyncMethods.am_send).22792280#### `typedef PyObject *(*ternaryfunc)(PyObject*, PyObject*, PyObject*)`22812282*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22832284#### `typedef PyObject *(*ssizeargfunc)(PyObject*, Py_ssize_t)`22852286*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22872288#### `typedef int (*ssizeobjargproc)(PyObject*, Py_ssize_t, PyObject*)`22892290*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22912292#### `typedef int (*objobjproc)(PyObject*, PyObject*)`22932294*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22952296#### `typedef int (*objobjargproc)(PyObject*, PyObject*, PyObject*)`22972298*Часть [Stable ABI](https://python-all.ru/3.16/c-api/stable.html#stable).*22992300## Примеры23012302Ниже приведены простые примеры определений типов Python. Они включают распространённые варианты использования, с которыми можно столкнуться. Некоторые демонстрируют сложные граничные случаи. За дополнительными примерами, практической информацией и учебным пособием обращайтесь к [Defining Extension Types: Tutorial](https://python-all.ru/3.16/extending/newtypes_tutorial.html#defining-new-types) и [Defining Extension Types: Assorted Topics](https://python-all.ru/3.16/extending/newtypes.html#new-types-topics).23032304Базовый [статический тип](https://python-all.ru/3.16/c-api/typeobj.html#static-types):23052306```c2307typedef struct {2308 PyObject_HEAD2309 const char *data;2310} MyObject;23112312static PyTypeObject MyObject_Type = {2313 PyVarObject_HEAD_INIT(NULL, 0)2314 .tp_name = "mymod.MyObject",2315 .tp_basicsize = sizeof(MyObject),2316 .tp_doc = PyDoc_STR("My objects"),2317 .tp_new = myobj_new,2318 .tp_dealloc = (destructor)myobj_dealloc,2319 .tp_repr = (reprfunc)myobj_repr,2320};2321```23222323Также можно встретить старый код (особенно в кодовой базе CPython) с более многословным инициализатором:23242325```c2326static PyTypeObject MyObject_Type = {2327 PyVarObject_HEAD_INIT(NULL, 0)2328 "mymod.MyObject", /* tp_name */2329 sizeof(MyObject), /* tp_basicsize */2330 0, /* tp_itemsize */2331 (destructor)myobj_dealloc, /* tp_dealloc */2332 0, /* tp_vectorcall_offset */2333 0, /* tp_getattr */2334 0, /* tp_setattr */2335 0, /* tp_as_async */2336 (reprfunc)myobj_repr, /* tp_repr */2337 0, /* tp_as_number */2338 0, /* tp_as_sequence */2339 0, /* tp_as_mapping */2340 0, /* tp_hash */2341 0, /* tp_call */2342 0, /* tp_str */2343 0, /* tp_getattro */2344 0, /* tp_setattro */2345 0, /* tp_as_buffer */2346 0, /* tp_flags */2347 PyDoc_STR("My objects"), /* tp_doc */2348 0, /* tp_traverse */2349 0, /* tp_clear */2350 0, /* tp_richcompare */2351 0, /* tp_weaklistoffset */2352 0, /* tp_iter */2353 0, /* tp_iternext */2354 0, /* tp_methods */2355 0, /* tp_members */2356 0, /* tp_getset */2357 0, /* tp_base */2358 0, /* tp_dict */2359 0, /* tp_descr_get */2360 0, /* tp_descr_set */2361 0, /* tp_dictoffset */2362 0, /* tp_init */2363 0, /* tp_alloc */2364 myobj_new, /* tp_new */2365};2366```23672368Тип, поддерживающий слабые ссылки, словари экземпляров и хеширование:23692370```c2371typedef struct {2372 PyObject_HEAD2373 const char *data;2374} MyObject;23752376static PyTypeObject MyObject_Type = {2377 PyVarObject_HEAD_INIT(NULL, 0)2378 .tp_name = "mymod.MyObject",2379 .tp_basicsize = sizeof(MyObject),2380 .tp_doc = PyDoc_STR("My objects"),2381 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |2382 Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |2383 Py_TPFLAGS_MANAGED_WEAKREF,2384 .tp_new = myobj_new,2385 .tp_traverse = (traverseproc)myobj_traverse,2386 .tp_clear = (inquiry)myobj_clear,2387 .tp_alloc = PyType_GenericNew,2388 .tp_dealloc = (destructor)myobj_dealloc,2389 .tp_repr = (reprfunc)myobj_repr,2390 .tp_hash = (hashfunc)myobj_hash,2391 .tp_richcompare = PyBaseObject_Type.tp_richcompare,2392};2393```23942395Подкласс str, который нельзя наследовать и который нельзя вызывать для создания экземпляров (например, используется отдельная фабричная функция) с помощью флага [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION):23962397```c2398typedef struct {2399 PyUnicodeObject raw;2400 char *extra;2401} MyStr;24022403static PyTypeObject MyStr_Type = {2404 PyVarObject_HEAD_INIT(NULL, 0)2405 .tp_name = "mymod.MyStr",2406 .tp_basicsize = sizeof(MyStr),2407 .tp_base = NULL, // устанавливается в &PyUnicode_Type при инициализации модуля2408 .tp_doc = PyDoc_STR("my custom str"),2409 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,2410 .tp_repr = (reprfunc)myobj_repr,2411};2412```24132414Простейший [статический тип](https://python-all.ru/3.16/c-api/typeobj.html#static-types) с экземплярами фиксированной длины:24152416```c2417typedef struct {2418 PyObject_HEAD2419} MyObject;24202421static PyTypeObject MyObject_Type = {2422 PyVarObject_HEAD_INIT(NULL, 0)2423 .tp_name = "mymod.MyObject",2424};2425```24262427Простейший [статический тип](https://python-all.ru/3.16/c-api/typeobj.html#static-types) с экземплярами переменной длины:24282429```c2430typedef struct {2431 PyObject_VAR_HEAD2432 const char *data[1];2433} MyObject;24342435static PyTypeObject MyObject_Type = {2436 PyVarObject_HEAD_INIT(NULL, 0)2437 .tp_name = "mymod.MyObject",2438 .tp_basicsize = sizeof(MyObject) - sizeof(char *),2439 .tp_itemsize = sizeof(char *),2440};2441```2442