type.md
1> **Источник:** https://python-all.ru/3.8/c-api/type.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты типов89**`PyTypeObject`**1011C-структура объектов, используемая для описания встроенных типов.1213**[PyObject](https://python-all.ru/3.8/c-api/structures.html#c.PyObject)\* `PyType_Type`**1415Это объект типа для объектов-типов; он совпадает с объектом [`type`](https://python-all.ru/3.8/library/functions.html#type) на уровне Python.1617#### `int PyType_Check(PyObject *o)`1819Возвращает истину, если объект *o* является объектом типа, включая экземпляры типов, производных от стандартного объекта типа. В остальных случаях возвращает ложь.2021#### `int PyType_CheckExact(PyObject *o)`2223Возвращает истину, если объект *o* является объектом типа, но не подтипом стандартного объекта типа. В остальных случаях возвращает ложь.2425#### `unsigned int PyType_ClearCache()`2627Очищает внутренний кеш поиска. Возвращает текущий тег версии.2829#### `unsigned long PyType_GetFlags(PyTypeObject* type)`3031Возвращает элемент [`tp_flags`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_flags) *type*. Эта функция в первую очередь предназначена для использования с *Py\_LIMITED\_API*; отдельные биты флагов гарантированно стабильны во всех выпусках Python, но доступ к [`tp_flags`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_flags) самому по себе не является частью ограниченного API.3233Новое в версии 3.2.3435Изменено в версии 3.4: Тип возвращаемого значения теперь `unsigned long`, а не `long`.3637#### `void PyType_Modified(PyTypeObject *type)`3839Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.4041#### `int PyType_HasFeature(PyTypeObject *o, int feature)`4243Возвращает истину, если объект типа *o* устанавливает признак *feature*. Признаки типа задаются одноразрядными флагами.4445#### `int PyType_IS_GC(PyTypeObject *o)`4647Возвращает истину, если объект типа поддерживает детектор циклов; это проверяет флаг типа [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.8/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC).4849#### `int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)`5051Возвращает истину, если *a* является подтипом *b*.5253Эта функция проверяет только непосредственные подтипы, то есть [`__subclasscheck__()`](https://python-all.ru/3.8/reference/datamodel.html#class.__subclasscheck__) не вызывается для *b*. Вызовите [`PyObject_IsSubclass()`](https://python-all.ru/3.8/c-api/object.html#c.PyObject_IsSubclass), чтобы выполнить ту же проверку, что и [`issubclass()`](https://python-all.ru/3.8/library/functions.html#issubclass) .5455#### `PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)`5657*Возвращаемое значение: новая ссылка.*5859Универсальный обработчик для слота [`tp_alloc`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_alloc) объекта-типа. Использует стандартный механизм выделения памяти Python для создания нового экземпляра и инициализации всего его содержимого значением `NULL`.6061#### `PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)`6263*Возвращаемое значение: новая ссылка.*6465Универсальный обработчик для слота [`tp_new`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_new) объекта-типа. Создаёт новый экземпляр, используя слот [`tp_alloc`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.6667#### `int PyType_Ready(PyTypeObject *type)`6869Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает `0` при успехе, или `-1` и устанавливает исключение при ошибке.7071#### `void* PyType_GetSlot(PyTypeObject *type, int slot)`7273Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен `NULL`, это означает, что либо слот `NULL`, либо функция была вызвана с недопустимыми параметрами. Обычно вызывающий код приводит указатель результата к соответствующему типу функции.7475См. `PyType_Slot.slot` для возможных значений аргумента *slot*.7677Исключение возбуждается, если *type* не является типом кучи.7879Новое в версии 3.4.8081## Создание типов, размещаемых в куче8283Следующие функции и структуры используются для создания [динамических типов](https://python-all.ru/3.8/c-api/typeobj.html#heap-types).8485#### `PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)`8687*Возвращаемое значение: новая ссылка.*8889Создаёт и возвращает объект типа кучи из *spec* ([`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.8/c-api/typeobj.html#Py_TPFLAGS_HEAPTYPE)).9091Если *bases* является кортежем, созданный тип кучи содержит все типы, содержащиеся в нём, как базовые типы.9293Если *bases* равно `NULL`, вместо него используется слот *Py\_tp\_bases*. Если и он равен `NULL`, используется слот *Py\_tp\_base*. Если и он равен `NULL`, новый тип наследуется от [`object`](https://python-all.ru/3.8/library/functions.html#object).9495Эта функция вызывает [`PyType_Ready()`](https://python-all.ru/3.8/c-api/type.html#c.PyType_Ready) у нового типа.9697Новое в версии 3.3.9899#### `PyObject* PyType_FromSpec(PyType_Spec *spec)`100101*Возвращаемое значение: новая ссылка.*102103Эквивалентно `PyType_FromSpecWithBases(spec, NULL)`.104105**`PyType_Spec`**106107Структура, определяющая поведение типа.108109**const char\* `PyType_Spec.name`**110111Имя типа, используемое для установки [`PyTypeObject.tp_name`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_name).112113**int `PyType_Spec.basicsize`**114115**int `PyType_Spec.itemsize`**116117Размер экземпляра в байтах; используется для установки [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_basicsize) и [`PyTypeObject.tp_itemsize`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_itemsize).118119**int `PyType_Spec.flags`**120121Флаги типа, используются для установки [`PyTypeObject.tp_flags`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_flags).122123Если флаг `Py_TPFLAGS_HEAPTYPE` не установлен, [`PyType_FromSpecWithBases()`](https://python-all.ru/3.8/c-api/type.html#c.PyType_FromSpecWithBases) устанавливает его автоматически.124125**[PyType\_Slot](https://python-all.ru/3.8/c-api/type.html#c.PyType_Slot) \*`PyType_Spec.slots`**126127Массив структур [`PyType_Slot`](https://python-all.ru/3.8/c-api/type.html#c.PyType_Slot). Завершается специальным значением слота `{0, NULL}`.128129**`PyType_Slot`**130131Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель на значение.132133**int `PyType_Slot.slot`**134135Идентификатор слота.136137Идентификаторы слотов именуются подобно именам полей структур [`PyTypeObject`](https://python-all.ru/3.8/c-api/type.html#c.PyTypeObject), [`PyNumberMethods`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyNumberMethods), [`PySequenceMethods`](https://python-all.ru/3.8/c-api/typeobj.html#c.PySequenceMethods), [`PyMappingMethods`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyMappingMethods) и [`PyAsyncMethods`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyAsyncMethods) с добавлением префикса `Py_`. Например, используйте:138139- `Py_tp_dealloc` для установки [`PyTypeObject.tp_dealloc`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)140- `Py_nb_add` для установки [`PyNumberMethods.nb_add`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyNumberMethods.nb_add)141- `Py_sq_length` для установки [`PySequenceMethods.sq_length`](https://python-all.ru/3.8/c-api/typeobj.html#c.PySequenceMethods.sq_length)142143Следующие поля нельзя задать с помощью [`PyType_Spec`](https://python-all.ru/3.8/c-api/type.html#c.PyType_Spec) и [`PyType_Slot`](https://python-all.ru/3.8/c-api/type.html#c.PyType_Slot):144145- [`tp_dict`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_dict)146- [`tp_mro`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_mro)147- [`tp_cache`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_cache)148- [`tp_subclasses`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_subclasses)149- [`tp_weaklist`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_weaklist)150- `tp_print`151- [`tp_weaklistoffset`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset)152- [`tp_dictoffset`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset)153- [`bf_getbuffer`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer)154- [`bf_releasebuffer`](https://python-all.ru/3.8/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer)155156Установка `Py_tp_bases` или `Py_tp_base` может быть проблематичной на некоторых платформах. Чтобы избежать проблем, используйте аргумент *bases* функции `PyType_FromSpecWithBases()` вместо этого.157158**void \*`PyType_Slot.pfunc`**159160Желаемое значение слота. В большинстве случаев это указатель на функцию.161162Не может быть `NULL`.163