type.md
1> **Источник:** https://python-all.ru/3.13/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.13/c-api/stable.html#stable) (как непрозрачная структура).*1213C-структура объектов, используемая для описания встроенных типов.1415#### `PyTypeObject PyType_Type`1617*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*1819Это объект типа для объектов-типов; он совпадает с объектом [`type`](https://python-all.ru/3.13/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.13/c-api/stable.html#stable).*3233Очищает внутренний кеш поиска. Возвращает текущий тег версии.3435#### `unsigned long PyType_GetFlags(PyTypeObject *type)`3637*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*3839Возвращает член [`tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags) объекта *type*. Эта функция в первую очередь предназначена для использования с `Py_LIMITED_API`; отдельные биты флагов гарантированно стабильны между версиями Python, но доступ к самому `tp_flags` не является частью [ограниченного API](https://python-all.ru/3.13/c-api/stable.html#limited-c-api).4041Добавлено в версии 3.2.4243Изменено в версии 3.4: Тип возвращаемого значения теперь `unsigned long`, а не `long`.4445#### `PyObject *PyType_GetDict(PyTypeObject *type)`4647Возвращает внутреннее пространство имён объекта-типа, которое иначе доступно только через прокси только для чтения ([`cls.__dict__`](https://python-all.ru/3.13/reference/datamodel.html#type.__dict__)). Это замена прямого доступа к [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict). Возвращаемый словарь должен рассматриваться как доступный только для чтения.4849Эта функция предназначена для конкретных случаев встраивания и привязки к языкам, где необходим прямой доступ к словарю, а косвенный доступ (например, через прокси или [`PyObject_GetAttr()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetAttr)) недостаточен.5051Модули расширений должны продолжать использовать `tp_dict`, напрямую или косвенно, при создании собственных типов.5253Добавлено в версии 3.12.5455#### `void PyType_Modified(PyTypeObject *type)`5657*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*5859Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.6061#### `int PyType_AddWatcher(PyType_WatchCallback callback)`6263Регистрирует *колбэк* в качестве наблюдателя за типами. Возвращает неотрицательный целочисленный идентификатор, который должен передаваться в последующие вызовы [`PyType_Watch()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Watch). В случае ошибки (например, закончились доступные идентификаторы наблюдателей) возвращает `-1` и устанавливает исключение.6465В сборках со свободной многопоточностью [`PyType_AddWatcher()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_AddWatcher) не является потокобезопасным, поэтому он должен вызываться при запуске (до создания первого потока).6667Добавлено в версии 3.12.6869#### `int PyType_ClearWatcher(int watcher_id)`7071Удаляет наблюдателя, идентифицированного по *watcher\_id* (ранее возвращённого из [`PyType_AddWatcher()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_AddWatcher)). Возвращает `0` при успехе, `-1` при ошибке (например, если *watcher\_id* никогда не был зарегистрирован).7273Расширение никогда не должно вызывать `PyType_ClearWatcher` с *watcher\_id*, который не был возвращён ему предыдущим вызовом [`PyType_AddWatcher()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_AddWatcher).7475Добавлено в версии 3.12.7677#### `int PyType_Watch(int watcher_id, PyObject *type)`7879Помечает *type* как наблюдаемый. Колбэк, получивший *watcher\_id* от [`PyType_AddWatcher()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_AddWatcher), будет вызываться каждый раз, когда [`PyType_Modified()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Modified) сообщает об изменении *type*. (Колбэк может вызываться только один раз для серии последовательных изменений *type*, если `_PyType_Lookup()` не вызывается для *type* между изменениями; это деталь реализации и может измениться.)8081Расширение никогда не должно вызывать `PyType_Watch` с *watcher\_id*, который не был возвращён ему предыдущим вызовом [`PyType_AddWatcher()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_AddWatcher).8283Добавлено в версии 3.12.8485#### `int PyType_Unwatch(int watcher_id, PyObject *type)`8687Помечает *type* как неотслеживаемый. Это отменяет предыдущий вызов [`PyType_Watch()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Watch). *type* не должен быть `NULL`.8889Расширение никогда не должно вызывать эту функцию с *watcher\_id*, который не был возвращён ему предыдущим вызовом [`PyType_AddWatcher()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_AddWatcher).9091При успехе функция возвращает `0`. При неудаче функция возвращает `-1` с установленным исключением.9293Добавлено в версии 3.12.9495#### `typedef int (*PyType_WatchCallback)(PyObject *type)`9697Тип колбэк-функции отслеживания типов.9899Колбэк не должен изменять *type* или приводить к вызову [`PyType_Modified()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Modified) для *type* или любого типа в его MRO; нарушение этого правила может привести к бесконечной рекурсии.100101Добавлено в версии 3.12.102103#### `int PyType_HasFeature(PyTypeObject *o, int feature)`104105Возвращает ненулевое значение, если объект типа *o* устанавливает признак *feature*. Признаки типов обозначаются одноразрядными флагами.106107#### `int PyType_FastSubclass(PyTypeObject *type, int flag)`108109Возвращает ненулевое значение, если объект типа *type* устанавливает флаг подкласса *flag*. Флаги подклассов обозначаются [`Py_TPFLAGS_*_SUBCLASS`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_LONG_SUBCLASS). Эта функция используется многими функциями `_Check` для распространённых типов.110111> **См. также**112>113> [`PyObject_TypeCheck()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_TypeCheck), который используется как более медленная альтернатива в функциях `_Check` для типов, не имеющих флагов подклассов.114115#### `int PyType_IS_GC(PyTypeObject *o)`116117Возвращает истину, если объект типа поддерживает детектор циклов; это проверяет флаг типа [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).118119#### `int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)`120121*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*122123Возвращает истину, если *a* является подтипом *b*.124125Эта функция проверяет только непосредственные подтипы, то есть [`__subclasscheck__()`](https://python-all.ru/3.13/reference/datamodel.html#type.__subclasscheck__) не вызывается для *b*. Вызовите [`PyObject_IsSubclass()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_IsSubclass), чтобы выполнить ту же проверку, что и [`issubclass()`](https://python-all.ru/3.13/library/functions.html#issubclass) .126127#### `PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)`128129*Возвращаемое значение: новая ссылка.*130131*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*132133Универсальный обработчик для слота [`tp_alloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_alloc) объекта-типа. Использует стандартный механизм выделения памяти Python для создания нового экземпляра и инициализации всего его содержимого значением `NULL`.134135#### `PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)`136137*Возвращаемое значение: новая ссылка.*138139*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*140141Универсальный обработчик для слота [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) объекта-типа. Создаёт новый экземпляр, используя слот [`tp_alloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.142143#### `int PyType_Ready(PyTypeObject *type)`144145*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*146147Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает `0` при успехе, или `-1` и устанавливает исключение при ошибке.148149> **Примечание**150>151> 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.13/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` in its flags then it **must** implement the GC protocol itself by at least implementing the [`tp_traverse`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_traverse) handle.152153#### `PyObject *PyType_GetName(PyTypeObject *type)`154155*Возвращаемое значение: новая ссылка.*156157*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.*158159Возвращает имя типа. Эквивалентно получению атрибута [`__name__`](https://python-all.ru/3.13/reference/datamodel.html#type.__name__) типа.160161Добавлено в версии 3.12.162163#### `PyObject *PyType_GetQualName(PyTypeObject *type)`164165*Возвращаемое значение: новая ссылка.*166167*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.11.*168169Возвращает квалифицированное имя типа. Эквивалентно получению атрибута [`__qualname__`](https://python-all.ru/3.13/reference/datamodel.html#type.__qualname__) типа.170171Добавлено в версии 3.12.172173#### `PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)`174175*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable), начиная с версии 3.13.*176177Возвращает полное квалифицированное имя типа. Эквивалентно `f"{type.__module__}.{type.__qualname__}"` или [`type.__qualname__`](https://python-all.ru/3.13/reference/datamodel.html#type.__qualname__), если [`type.__module__`](https://python-all.ru/3.13/reference/datamodel.html#type.__module__) не является строкой или равно `"builtins"`.178179Добавлено в версии 3.13.180181#### `PyObject *PyType_GetModuleName(PyTypeObject *type)`182183*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable), начиная с версии 3.13.*184185Возвращает имя модуля типа. Эквивалентно получению атрибута [`type.__module__`](https://python-all.ru/3.13/reference/datamodel.html#type.__module__).186187Добавлено в версии 3.13.188189#### `void *PyType_GetSlot(PyTypeObject *type, int slot)`190191*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.4.*192193Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен `NULL`, это означает, что либо слот `NULL`, либо функция была вызвана с недопустимыми параметрами. Обычно вызывающий код приводит указатель результата к соответствующему типу функции.194195См. [`PyType_Slot.slot`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot.slot) для возможных значений аргумента *slot*.196197Добавлено в версии 3.4.198199Изменено в версии 3.10: [`PyType_GetSlot()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetSlot) теперь может принимать все типы. Ранее он был ограничен [динамическими типами (heap types)](https://python-all.ru/3.13/c-api/typeobj.html#heap-types).200201#### `PyObject *PyType_GetModule(PyTypeObject *type)`202203*Возвращаемое значение: заимствованная ссылка.*204205*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.10.*206207Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromModuleAndSpec).208209Возвращаемая ссылка является [заимствованной](https://python-all.ru/3.13/glossary.html#term-borrowed-reference) от *type* и будет действительна, пока существует ссылка на *type*. Не освобождайте её с помощью [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) или аналогичных средств.210211Если с данным типом не связан ни один модуль, устанавливает [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) и возвращает `NULL`.212213Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание: в таком методе `PyType_GetModule(Py_TYPE(self))` может не вернуть ожидаемый результат. `Py_TYPE(self)` может оказаться *подклассом* нужного класса, а подклассы необязательно определены в том же модуле, что и их суперкласс. См. [`PyCMethod`](https://python-all.ru/3.13/c-api/structures.html#c.PyCMethod), чтобы получить класс, определяющий метод. См. [`PyType_GetModuleByDef()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetModuleByDef) для случаев, когда `PyCMethod` нельзя использовать.214215Добавлено в версии 3.9.216217#### `void *PyType_GetModuleState(PyTypeObject *type)`218219*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.10.*220221Возвращает состояние объекта модуля, связанного с данным типом. Это сокращение для вызова [`PyModule_GetState()`](https://python-all.ru/3.13/c-api/module.html#c.PyModule_GetState) для результата [`PyType_GetModule()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetModule).222223Если с данным типом не связан ни один модуль, устанавливает [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) и возвращает `NULL`.224225Если с *type* связан модуль, но его состояние равно `NULL`, возвращает `NULL` без установки исключения.226227Добавлено в версии 3.9.228229#### `PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)`230231*Возвращаемое значение: заимствованная ссылка.*232233*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.13.*234235Найти первый суперкласс, модуль которого был создан из заданного [`PyModuleDef`](https://python-all.ru/3.13/c-api/module.html#c.PyModuleDef) *def*, и вернуть этот модуль.236237Если модуль не найден, возбуждает [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) и возвращает `NULL`.238239Эта функция предназначена для использования совместно с [`PyModule_GetState()`](https://python-all.ru/3.13/c-api/module.html#c.PyModule_GetState) для получения состояния модуля из слотовых методов (таких как [`tp_init`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_init) или [`nb_add`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_add)) и других мест, где определяющий класс метода не может быть передан с помощью соглашения о вызове [`PyCMethod`](https://python-all.ru/3.13/c-api/structures.html#c.PyCMethod).240241Возвращаемая ссылка является [заимствованной](https://python-all.ru/3.13/glossary.html#term-borrowed-reference) от *type* и будет действительна, пока существует ссылка на *type*. Не освобождайте её с помощью [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) или аналогичных средств.242243Добавлено в версии 3.12.244245#### `int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)`246247> *Это [нестабильное API](https://python-all.ru/3.13/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*248249Пытается назначить версионный тег заданному типу.250251Возвращает 1, если тип уже имел допустимый версионный тег или был назначен новый, или 0, если новый тег не удалось назначить.252253Добавлено в версии 3.12.254255#### `int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)`256257Возвращает true, если экземпляры *type* поддерживают создание слабых ссылок, и false в противном случае. Эта функция всегда завершается успешно. *type* не должен быть `NULL`.258259> **См. также**260>261> - [Объекты слабых ссылок](https://python-all.ru/3.13/c-api/weakref.html#weakrefobjects)262> - [`weakref`](https://python-all.ru/3.13/library/weakref.html#module-weakref)263264## Создание типов, размещаемых в куче265266Следующие функции и структуры используются для создания [динамических типов](https://python-all.ru/3.13/c-api/typeobj.html#heap-types).267268#### `PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)`269270*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.12.*271272Создаёт и возвращает [кучевый тип](https://python-all.ru/3.13/c-api/typeobj.html#heap-types) из *spec* (см. [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE)).273274Метакласс *metaclass* используется для построения результирующего объекта типа. Если *metaclass* равен `NULL`, метакласс наследуется от *bases* (или слотов *Py\_tp\_base\[s\]*, если *bases* равно `NULL`, см. ниже).275276Метаклассы, переопределяющие [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new), не поддерживаются, за исключением случаев, когда `tp_new` равен `NULL`. (Для обратной совместимости другие функции `PyType_From*` допускают такие метаклассы. Они игнорируют `tp_new`, что может привести к неполной инициализации. Это устарело, и в Python 3.14+ такие метаклассы не будут поддерживаться.)277278Аргумент *bases* можно использовать для указания базовых классов; он может быть как одним классом, так и кортежем классов. Если *bases* равен `NULL`, вместо него используется слот *Py\_tp\_bases*. Если и он равен `NULL`, вместо него используется слот *Py\_tp\_base*. Если и он равен `NULL`, новый тип наследуется от [`object`](https://python-all.ru/3.13/library/functions.html#object).279280Аргумент *module* можно использовать для записи модуля, в котором определён новый класс. Он должен быть объектом модуля или `NULL`. Если не `NULL`, модуль связывается с новым типом и впоследствии может быть получен с помощью [`PyType_GetModule()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetModule). Связанный модуль не наследуется подклассами; его нужно указывать для каждого класса отдельно.281282Эта функция вызывает [`PyType_Ready()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Ready) у нового типа.283284Обратите внимание, что эта функция *не* полностью соответствует поведению вызова [`type()`](https://python-all.ru/3.13/library/functions.html#type) или использования оператора [`class`](https://python-all.ru/3.13/reference/compound_stmts.html#class). С пользовательскими базовыми типами или метаклассами предпочтительнее [вызов](https://python-all.ru/3.13/c-api/call.html#capi-call) `type` (или метакласса) вместо функций `PyType_From*`. В частности:285286- [`__new__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__new__) не вызывается для нового класса (и должен быть установлен в `type.__new__`).287- [`__init__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__init__) не вызывается для нового класса.288- [`__init_subclass__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__init_subclass__) не вызывается ни для каких базовых классов.289- [`__set_name__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__set_name__) не вызывается для новых дескрипторов.290291Добавлено в версии 3.12.292293#### `PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)`294295*Возвращаемое значение: новая ссылка.*296297*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.10.*298299Эквивалентно `PyType_FromMetaclass(NULL, module, spec, bases)`.300301Добавлено в версии 3.9.302303Изменено в версии 3.10: Функция теперь принимает один класс в качестве аргумента *bases* и `NULL` в качестве слота `tp_doc`.304305Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры [`type`](https://python-all.ru/3.13/library/functions.html#type).306307[`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) метакласса *игнорируется*. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяет `tp_new`, устарело, и в Python 3.14+ оно будет запрещено.308309#### `PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)`310311*Возвращаемое значение: новая ссылка.*312313*Часть [стабильного ABI](https://python-all.ru/3.13/c-api/stable.html#stable) начиная с версии 3.3.*314315Эквивалентно `PyType_FromMetaclass(NULL, NULL, spec, bases)`.316317Добавлено в версии 3.3.318319Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры [`type`](https://python-all.ru/3.13/library/functions.html#type).320321[`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) метакласса *игнорируется*. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяет `tp_new`, устарело, и в Python 3.14+ оно будет запрещено.322323#### `PyObject *PyType_FromSpec(PyType_Spec *spec)`324325*Возвращаемое значение: новая ссылка.*326327*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable).*328329Эквивалентно `PyType_FromMetaclass(NULL, NULL, spec, NULL)`.330331Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, указанным в слотах *Py\_tp\_base\[s\]*. Ранее возвращались только экземпляры [`type`](https://python-all.ru/3.13/library/functions.html#type).332333[`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) метакласса *игнорируется*. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяет `tp_new`, устарело, и в Python 3.14+ оно будет запрещено.334335Keep old URL fragments working (see gh-97908)336337#### `type PyType_Spec`338339*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) (включая все члены).*340341Структура, определяющая поведение типа.342343#### `const char *name`344345Имя типа, используемое для установки [`PyTypeObject.tp_name`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_name).346347#### `int basicsize`348349Если положительное, задаёт размер экземпляра в байтах. Используется для установки [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).350351Если равно нулю, указывает, что [`tp_basicsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_basicsize) должен наследоваться.352353Если отрицательное, абсолютное значение указывает, сколько дополнительного места требуется экземплярам класса *сверх* суперкласса. Используйте [`PyObject_GetTypeData()`](https://python-all.ru/3.13/c-api/object.html#c.PyObject_GetTypeData) для получения указателя на память, зарезервированную таким образом для подкласса. Для отрицательного `basicsize` Python при необходимости вставляет выравнивание, чтобы удовлетворить требованиям выравнивания [`tp_basicsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).354355Изменено в версии 3.12: Ранее это поле не могло быть отрицательным.356357#### `int itemsize`358359Размер одного элемента типа переменного размера в байтах. Используется для установки [`PyTypeObject.tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize). См. документацию `tp_itemsize` о предостережениях.360361Если равно нулю, [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) наследуется. Расширение произвольных классов переменного размера опасно, поскольку некоторые типы используют фиксированное смещение для памяти переменного размера, которая может затем перекрыться с памятью фиксированного размера, используемой подклассом. Чтобы предотвратить ошибки, наследование `itemsize` возможно только в следующих ситуациях:362363- Базовый класс не имеет изменяемого размера (его [`tp_itemsize`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) равно нулю).364- Запрошенный [`PyType_Spec.basicsize`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Spec.basicsize) положителен, что говорит о том, что расположение памяти базового класса известно.365- Запрошенный [`PyType_Spec.basicsize`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Spec.basicsize) равен нулю, что говорит о том, что подкласс не обращается к памяти экземпляра напрямую.366- С флагом [`Py_TPFLAGS_ITEMS_AT_END`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_ITEMS_AT_END).367368#### `unsigned int flags`369370Флаги типа, используются для установки [`PyTypeObject.tp_flags`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_flags).371372Если флаг `Py_TPFLAGS_HEAPTYPE` не установлен, [`PyType_FromSpecWithBases()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpecWithBases) устанавливает его автоматически.373374#### `PyType_Slot *slots`375376Массив структур [`PyType_Slot`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot). Завершается специальным значением слота `{0, NULL}`.377378Каждый идентификатор слота должен быть указан не более одного раза.379380Keep old URL fragments working (see gh-97908)381382#### `type PyType_Slot`383384*Часть [Stable ABI](https://python-all.ru/3.13/c-api/stable.html#stable) (включая все члены).*385386Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель на значение.387388#### `int slot`389390Идентификатор слота.391392Идентификаторы слотов именуются подобно именам полей структур [`PyTypeObject`](https://python-all.ru/3.13/c-api/type.html#c.PyTypeObject), [`PyNumberMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods), [`PySequenceMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods), [`PyMappingMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyMappingMethods) и [`PyAsyncMethods`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyAsyncMethods) с добавлением префикса `Py_`. Например, используйте:393394- `Py_tp_dealloc` для установки [`PyTypeObject.tp_dealloc`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)395- `Py_nb_add` для установки [`PyNumberMethods.nb_add`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyNumberMethods.nb_add)396- `Py_sq_length` для установки [`PySequenceMethods.sq_length`](https://python-all.ru/3.13/c-api/typeobj.html#c.PySequenceMethods.sq_length)397398Следующие поля «offset» нельзя задать с помощью [`PyType_Slot`](https://python-all.ru/3.13/c-api/type.html#c.PyType_Slot):399400- [`tp_weaklistoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) (по возможности используйте [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) вместо этого)401- [`tp_dictoffset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) (по возможности используйте [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) вместо этого)402- [`tp_vectorcall_offset`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) (используйте `"__vectorcalloffset__"` в [PyMemberDef](https://python-all.ru/3.13/c-api/structures.html#pymemberdef-offsets))403404Если невозможно переключиться на флаг `MANAGED` (например, для vectorcall или для поддержки Python версии ниже 3.12), укажите смещение в [`Py_tp_members`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_members). Подробнее см. [документацию PyMemberDef](https://python-all.ru/3.13/c-api/structures.html#pymemberdef-offsets).405406Следующие поля вообще нельзя задать при создании динамического типа:407408- [`tp_vectorcall`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall) (используйте [`tp_new`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_new) и/или [`tp_init`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_init))409- Внутренние поля: [`tp_dict`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_dict), [`tp_mro`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_mro), [`tp_cache`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_cache), [`tp_subclasses`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_subclasses) и [`tp_weaklist`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyTypeObject.tp_weaklist).410411Установка [`Py_tp_bases`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_tp_bases) или [`Py_tp_base`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_tp_base) может быть проблематичной на некоторых платформах. Чтобы избежать проблем, используйте аргумент *bases* функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpecWithBases) вместо этого.412413Изменено в версии 3.9: Слоты в [`PyBufferProcs`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs) могут быть заданы в неограниченном API.414415Изменено в версии 3.11: [`bf_getbuffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer) и [`bf_releasebuffer`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) теперь доступны в рамках [ограниченного API](https://python-all.ru/3.13/c-api/stable.html#limited-c-api).416417#### `void *pfunc`418419Желаемое значение слота. В большинстве случаев это указатель на функцию.420421Слоты, отличные от `Py_tp_doc`, не могут быть `NULL`.422