type.md
1> **Источник:** https://python-all.ru/3.11/c-api/type.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты типов89#### `type PyTypeObject`1011*Часть [Limited API](https://python-all.ru/3.11/c-api/stable.html#stable) (как непрозрачная структура).*1213C-структура объектов, используемая для описания встроенных типов.1415#### `PyTypeObject PyType_Type`1617*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*1819Это объект типа для объектов-типов; он совпадает с объектом [`type`](https://python-all.ru/3.11/library/functions.html#type) на уровне Python.2021#### `int PyType_Check(PyObject *o)`2223Возвращает ненулевое значение, если объект *o* является объектом-типом, включая экземпляры типов, производных от стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.2425#### `int PyType_CheckExact(PyObject *o)`2627Возвращает ненулевое значение, если объект *o* является объектом-типом, но не подтипом стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.2829#### `unsigned int PyType_ClearCache()`3031*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*3233Очищает внутренний кеш поиска. Возвращает текущий тег версии.3435#### `unsigned long PyType_GetFlags(PyTypeObject *type)`3637*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*3839Возвращает член [`tp_flags`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_flags) объекта *type*. Эта функция в первую очередь предназначена для использования с `Py_LIMITED_API`; отдельные биты флагов гарантированно стабильны между версиями Python, но доступ к самому [`tp_flags`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_flags) не является частью [ограниченного API](https://python-all.ru/3.11/c-api/stable.html#limited-c-api).4041Новое в версии 3.2.4243Изменено в версии 3.4: Тип возвращаемого значения теперь `unsigned long`, а не `long`.4445#### `void PyType_Modified(PyTypeObject *type)`4647*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*4849Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.5051#### `int PyType_HasFeature(PyTypeObject *o, int feature)`5253Возвращает ненулевое значение, если объект типа *o* устанавливает признак *feature*. Признаки типов обозначаются одноразрядными флагами.5455#### `int PyType_IS_GC(PyTypeObject *o)`5657Возвращает истину, если объект типа поддерживает детектор циклов; это проверяет флаг типа [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).5859#### `int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)`6061*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*6263Возвращает истину, если *a* является подтипом *b*.6465Эта функция проверяет только непосредственные подтипы, то есть [`__subclasscheck__()`](https://python-all.ru/3.11/reference/datamodel.html#class.__subclasscheck__) не вызывается для *b*. Вызовите [`PyObject_IsSubclass()`](https://python-all.ru/3.11/c-api/object.html#c.PyObject_IsSubclass), чтобы выполнить ту же проверку, что и [`issubclass()`](https://python-all.ru/3.11/library/functions.html#issubclass) .6667#### `PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)`6869*Возвращаемое значение: новая ссылка.*7071*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*7273Универсальный обработчик для слота [`tp_alloc`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_alloc) объекта-типа. Использует стандартный механизм выделения памяти Python для создания нового экземпляра и инициализации всего его содержимого значением `NULL`.7475#### `PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)`7677*Возвращаемое значение: новая ссылка.*7879*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*8081Универсальный обработчик для слота [`tp_new`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_new) объекта-типа. Создаёт новый экземпляр, используя слот [`tp_alloc`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.8283#### `int PyType_Ready(PyTypeObject *type)`8485*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*8687Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает `0` при успехе, или `-1` и устанавливает исключение при ошибке.8889> **Примечание**90>91> If some of the base classes implements the GC protocol and the provided type does not include the [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) in its flags, then the GC protocol will be automatically implemented from its parents. On the contrary, if the type being created does include [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC) in its flags then it **must** implement the GC protocol itself by at least implementing the [`tp_traverse`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_traverse) handle.9293#### `PyObject *PyType_GetName(PyTypeObject *type)`9495*Возвращаемое значение: новая ссылка.*9697*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.11.*9899Возвращает имя типа. Эквивалентно получению атрибута `__name__`.100101Новое в версии 3.11.102103#### `PyObject *PyType_GetQualName(PyTypeObject *type)`104105*Возвращаемое значение: новая ссылка.*106107*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.11.*108109Возвращает квалифицированное имя типа. Эквивалентно получению атрибута `__qualname__` типа.110111Новое в версии 3.11.112113#### `void *PyType_GetSlot(PyTypeObject *type, int slot)`114115*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.4.*116117Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен `NULL`, это означает, что либо слот `NULL`, либо функция была вызвана с недопустимыми параметрами. Обычно вызывающий код приводит указатель результата к соответствующему типу функции.118119См. `PyType_Slot.slot` для возможных значений аргумента *slot*.120121Новое в версии 3.4.122123Изменено в версии 3.10: [`PyType_GetSlot()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_GetSlot) теперь может принимать все типы. Ранее он был ограничен [динамическими типами (heap types)](https://python-all.ru/3.11/c-api/typeobj.html#heap-types).124125#### `PyObject *PyType_GetModule(PyTypeObject *type)`126127*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*128129Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromModuleAndSpec).130131Если с данным типом не связан ни один модуль, устанавливает [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) и возвращает `NULL`.132133Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание: в таком методе `PyType_GetModule(Py_TYPE(self))` может не вернуть ожидаемый результат. `Py_TYPE(self)` может оказаться *подклассом* нужного класса, а подклассы необязательно определены в том же модуле, что и их суперкласс. См. [`PyCMethod`](https://python-all.ru/3.11/c-api/structures.html#c.PyCMethod), чтобы получить класс, определяющий метод. См. [`PyType_GetModuleByDef()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_GetModuleByDef) для случаев, когда `PyCMethod` нельзя использовать.134135Новое в версии 3.9.136137#### `void *PyType_GetModuleState(PyTypeObject *type)`138139*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*140141Возвращает состояние объекта модуля, связанного с данным типом. Это сокращение для вызова [`PyModule_GetState()`](https://python-all.ru/3.11/c-api/module.html#c.PyModule_GetState) для результата [`PyType_GetModule()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_GetModule).142143Если с данным типом не связан ни один модуль, устанавливает [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) и возвращает `NULL`.144145Если с *type* связан модуль, но его состояние равно `NULL`, возвращает `NULL` без установки исключения.146147Новое в версии 3.9.148149#### `PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)`150151Найти первый суперкласс, модуль которого был создан из заданного [`PyModuleDef`](https://python-all.ru/3.11/c-api/module.html#c.PyModuleDef) *def*, и вернуть этот модуль.152153Если модуль не найден, возбуждает [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) и возвращает `NULL`.154155Эта функция предназначена для использования совместно с [`PyModule_GetState()`](https://python-all.ru/3.11/c-api/module.html#c.PyModule_GetState) для получения состояния модуля из слотовых методов (таких как [`tp_init`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_init) или [`nb_add`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyNumberMethods.nb_add)) и других мест, где определяющий класс метода не может быть передан с помощью соглашения о вызове [`PyCMethod`](https://python-all.ru/3.11/c-api/structures.html#c.PyCMethod).156157Новое в версии 3.11.158159## Создание типов, размещаемых в куче160161Следующие функции и структуры используются для создания [динамических типов](https://python-all.ru/3.11/c-api/typeobj.html#heap-types).162163#### `PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)`164165*Возвращаемое значение: новая ссылка.*166167*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*168169Создаёт и возвращает [динамический тип (heap type)](https://python-all.ru/3.11/c-api/typeobj.html#heap-types) из *spec* ([`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE)).170171Аргумент *bases* можно использовать для указания базовых классов; он может быть как одним классом, так и кортежем классов. Если *bases* равен `NULL`, вместо него используется слот *Py\_tp\_bases*. Если и он равен `NULL`, вместо него используется слот *Py\_tp\_base*. Если и он равен `NULL`, новый тип наследуется от [`object`](https://python-all.ru/3.11/library/functions.html#object).172173Аргумент *module* можно использовать для записи модуля, в котором определён новый класс. Он должен быть объектом модуля или `NULL`. Если не `NULL`, модуль связывается с новым типом и впоследствии может быть получен с помощью [`PyType_GetModule()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_GetModule). Связанный модуль не наследуется подклассами; его нужно указывать для каждого класса отдельно.174175Эта функция вызывает [`PyType_Ready()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_Ready) у нового типа.176177Новое в версии 3.9.178179Изменено в версии 3.10: Функция теперь принимает один класс в качестве аргумента *bases* и `NULL` в качестве слота `tp_doc`.180181#### `PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)`182183*Возвращаемое значение: новая ссылка.*184185*Часть [стабильного ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.3.*186187Эквивалентно `PyType_FromModuleAndSpec(NULL, spec, bases)`.188189Новое в версии 3.3.190191#### `PyObject *PyType_FromSpec(PyType_Spec *spec)`192193*Возвращаемое значение: новая ссылка.*194195*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*196197Эквивалентно `PyType_FromSpecWithBases(spec, NULL)`.198199#### `type PyType_Spec`200201*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) (включая все члены).*202203Структура, определяющая поведение типа.204205#### `const char *PyType_Spec.name`206207Имя типа, используемое для установки [`PyTypeObject.tp_name`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_name).208209#### `int PyType_Spec.basicsize`210211#### `int PyType_Spec.itemsize`212213Размер экземпляра в байтах; используется для установки [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_basicsize) и [`PyTypeObject.tp_itemsize`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_itemsize).214215#### `int PyType_Spec.flags`216217Флаги типа, используются для установки [`PyTypeObject.tp_flags`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_flags).218219Если флаг `Py_TPFLAGS_HEAPTYPE` не установлен, [`PyType_FromSpecWithBases()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromSpecWithBases) устанавливает его автоматически.220221#### `PyType_Slot *PyType_Spec.slots`222223Массив структур [`PyType_Slot`](https://python-all.ru/3.11/c-api/type.html#c.PyType_Slot). Завершается специальным значением слота `{0, NULL}`.224225#### `type PyType_Slot`226227*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) (включая все члены).*228229Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель на значение.230231#### `int PyType_Slot.slot`232233> Идентификатор слота.234>235> Идентификаторы слотов именуются подобно именам полей структур [`PyTypeObject`](https://python-all.ru/3.11/c-api/type.html#c.PyTypeObject), [`PyNumberMethods`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyNumberMethods), [`PySequenceMethods`](https://python-all.ru/3.11/c-api/typeobj.html#c.PySequenceMethods), [`PyMappingMethods`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyMappingMethods) и [`PyAsyncMethods`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyAsyncMethods) с добавлением префикса `Py_`. Например, используйте:236>237> - `Py_tp_dealloc` для установки [`PyTypeObject.tp_dealloc`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)238> - `Py_nb_add` для установки [`PyNumberMethods.nb_add`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyNumberMethods.nb_add)239> - `Py_sq_length` для установки [`PySequenceMethods.sq_length`](https://python-all.ru/3.11/c-api/typeobj.html#c.PySequenceMethods.sq_length)240>241> Следующие поля вообще нельзя задать с помощью [`PyType_Spec`](https://python-all.ru/3.11/c-api/type.html#c.PyType_Spec) и `PyType_Slot`:242>243> - [`tp_dict`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_dict)244> - [`tp_mro`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_mro)245> - [`tp_cache`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_cache)246> - [`tp_subclasses`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_subclasses)247> - [`tp_weaklist`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_weaklist)248> - [`tp_vectorcall`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall)249> - [`tp_weaklistoffset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) (см. [PyMemberDef](https://python-all.ru/3.11/c-api/structures.html#pymemberdef-offsets))250> - [`tp_dictoffset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) (см. [PyMemberDef](https://python-all.ru/3.11/c-api/structures.html#pymemberdef-offsets))251> - [`tp_vectorcall_offset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) (см. [PyMemberDef](https://python-all.ru/3.11/c-api/structures.html#pymemberdef-offsets))252>253> Установка `Py_tp_bases` или `Py_tp_base` может быть проблематичной на некоторых платформах. Чтобы избежать проблем, используйте аргумент *bases* функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromSpecWithBases) вместо этого.254255Изменено в версии 3.9: Слоты в [`PyBufferProcs`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyBufferProcs) могут быть заданы в неограниченном API.256257Изменено в версии 3.11: [`bf_getbuffer`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer) и [`bf_releasebuffer`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) теперь доступны в рамках [ограниченного API](https://python-all.ru/3.11/c-api/stable.html#limited-c-api).258259#### `void *PyType_Slot.pfunc`260261Желаемое значение слота. В большинстве случаев это указатель на функцию.262263Слоты, отличные от `Py_tp_doc`, не могут быть `NULL`.264