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

type.md

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

1> **Источник:** https://python-all.ru/3.15/c-api/type.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты типов89#### `type PyTypeObject`1011*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (как непрозрачная структура).*1213C-структура объектов, используемая для описания встроенных типов.1415#### `PyTypeObject PyType_Type`1617*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*1819Это объект типа для объектов-типов; он совпадает с объектом [`type`](https://python-all.ru/3.15/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.15/c-api/stable.html#stable).*3233Очищает внутренний кеш поиска. Возвращает текущий тег версии.3435#### `unsigned long PyType_GetFlags(PyTypeObject *type)`3637*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*3839Возвращает член [`tp_flags`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_flags) объекта *type*. Эта функция в первую очередь предназначена для использования с `Py_LIMITED_API`; отдельные биты флагов гарантированно стабильны между версиями Python, но доступ к самому `tp_flags` не является частью [ограниченного API](https://python-all.ru/3.15/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.15/reference/datamodel.html#type.__dict__)). Это замена прямого доступа к [`tp_dict`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_dict). Возвращаемый словарь должен рассматриваться как доступный только для чтения.4849Эта функция предназначена для конкретных случаев встраивания и привязки к языкам, где необходим прямой доступ к словарю, а косвенный доступ (например, через прокси или [`PyObject_GetAttr()`](https://python-all.ru/3.15/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.15/c-api/stable.html#stable).*5859Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.6061#### `int PyType_AddWatcher(PyType_WatchCallback callback)`6263Регистрирует *колбэк* в качестве наблюдателя за типами. Возвращает неотрицательный целочисленный идентификатор, который должен передаваться в последующие вызовы [`PyType_Watch()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Watch). В случае ошибки (например, закончились доступные идентификаторы наблюдателей) возвращает `-1` и устанавливает исключение.6465В сборках со свободной многопоточностью [`PyType_AddWatcher()`](https://python-all.ru/3.15/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.15/c-api/type.html#c.PyType_AddWatcher)). Возвращает `0` при успехе, `-1` при ошибке (например, если *watcher\_id* никогда не был зарегистрирован).7273Расширение никогда не должно вызывать `PyType_ClearWatcher` с *watcher\_id*, который не был возвращён ему предыдущим вызовом [`PyType_AddWatcher()`](https://python-all.ru/3.15/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.15/c-api/type.html#c.PyType_AddWatcher), будет вызываться каждый раз, когда [`PyType_Modified()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Modified) сообщает об изменении *type*. (Колбэк может вызываться только один раз для серии последовательных изменений *type*, если `_PyType_Lookup()` не вызывается для *type* между изменениями; это деталь реализации и может измениться.)8081Колбэк также вызывается при освобождении наблюдаемого типа, размещённого в куче.8283Расширение никогда не должно вызывать `PyType_Watch` с *watcher\_id*, который не был возвращён ему предыдущим вызовом [`PyType_AddWatcher()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_AddWatcher).8485Добавлено в версии 3.12.8687Изменено в версии 3.15: Теперь колбэк также вызывается при освобождении наблюдаемого типа, размещённого в куче.8889#### `int PyType_Unwatch(int watcher_id, PyObject *type)`9091Помечает *type* как неотслеживаемый. Это отменяет предыдущий вызов [`PyType_Watch()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Watch). *type* не должен быть `NULL`.9293Расширение никогда не должно вызывать эту функцию с *watcher\_id*, который не был возвращён ему предыдущим вызовом [`PyType_AddWatcher()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_AddWatcher).9495При успехе функция возвращает `0`. При неудаче функция возвращает `-1` с установленным исключением.9697Добавлено в версии 3.12.9899#### `typedef int (*PyType_WatchCallback)(PyObject *type)`100101Тип колбэк-функции отслеживания типов.102103Колбэк не должен изменять *type* или приводить к вызову [`PyType_Modified()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Modified) для *type* или любого типа в его MRO; нарушение этого правила может привести к бесконечной рекурсии.104105Колбэк может вызываться во время освобождения типа. В этом случае объект типа временно воскрешается (его счётчик ссылок не меньше 1), и все его атрибуты остаются корректными. Однако колбэк не должен сохранять новые сильные ссылки на тип, так как это воскресит объект и предотвратит его освобождение.106107Добавлено в версии 3.12.108109Изменено в версии 3.15: Теперь колбэк может вызываться во время освобождения отслеживаемого динамического типа.110111#### `int PyType_HasFeature(PyTypeObject *o, int feature)`112113Возвращает ненулевое значение, если объект типа *o* устанавливает признак *feature*. Признаки типов обозначаются одноразрядными флагами.114115#### `int PyType_FastSubclass(PyTypeObject *type, int flag)`116117Возвращает ненулевое значение, если объект типа *type* устанавливает флаг подкласса *flag*. Флаги подклассов обозначаются [`Py_TPFLAGS_*_SUBCLASS`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_LONG_SUBCLASS). Эта функция используется многими функциями `_Check` для распространённых типов.118119> **См. также**120>121> [`PyObject_TypeCheck()`](https://python-all.ru/3.15/c-api/object.html#c.PyObject_TypeCheck), который используется как более медленная альтернатива в функциях `_Check` для типов, не имеющих флагов подклассов.122123#### `int PyType_IS_GC(PyTypeObject *o)`124125Возвращает истину, если объект типа поддерживает детектор циклов; это проверяет флаг типа [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC).126127#### `int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)`128129*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*130131Возвращает истину, если *a* является подтипом *b*.132133Эта функция проверяет только непосредственные подтипы, то есть [`__subclasscheck__()`](https://python-all.ru/3.15/reference/datamodel.html#type.__subclasscheck__) не вызывается для *b*. Вызовите [`PyObject_IsSubclass()`](https://python-all.ru/3.15/c-api/object.html#c.PyObject_IsSubclass), чтобы выполнить ту же проверку, что и [`issubclass()`](https://python-all.ru/3.15/library/functions.html#issubclass) .134135#### `PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)`136137*Возвращаемое значение: новая ссылка.*138139*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*140141Общий обработчик для слота [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) объекта типа. Использует механизм выделения памяти Python по умолчанию для выделения памяти под новый экземпляр, обнуляет память, а затем инициализирует её, как при вызове [`PyObject_Init()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_Init) или [`PyObject_InitVar()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_InitVar).142143Не вызывайте это напрямую для выделения памяти под объект; вместо этого вызывайте слот [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа.144145Для типов, поддерживающих сборку мусора (т.е. установлен флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC)), эта функция ведёт себя как [`PyObject_GC_New`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_New) или [`PyObject_GC_NewVar`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_NewVar) (за исключением того, что память гарантированно обнуляется перед инициализацией), и должна использоваться в паре с [`PyObject_GC_Del()`](https://python-all.ru/3.15/c-api/gcsupport.html#c.PyObject_GC_Del) в [`tp_free`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_free). В противном случае она ведёт себя как [`PyObject_New`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_New) или [`PyObject_NewVar`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_NewVar) (с той же гарантией обнуления) и должна использоваться в паре с [`PyObject_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyObject_Free) в `tp_free`.146147#### `PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)`148149*Возвращаемое значение: новая ссылка.*150151*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*152153Общий обработчик для слота [`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new) объекта типа. Создаёт новый экземпляр, используя слот [`tp_alloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_alloc) типа, и возвращает полученный объект.154155#### `int PyType_Ready(PyTypeObject *type)`156157*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*158159Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает `0` при успехе, или `-1` и устанавливает исключение при ошибке.160161> **Примечание**162>163> 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.15/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.15/c-api/typeobj.html#c.PyTypeObject.tp_traverse) handle.164165#### `PyObject *PyType_GetName(PyTypeObject *type)`166167*Возвращаемое значение: новая ссылка.*168169*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.11.*170171Возвращает имя типа. Эквивалентно получению атрибута [`__name__`](https://python-all.ru/3.15/reference/datamodel.html#type.__name__) типа.172173Добавлено в версии 3.12.174175#### `PyObject *PyType_GetQualName(PyTypeObject *type)`176177*Возвращаемое значение: новая ссылка.*178179*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.11.*180181Возвращает квалифицированное имя типа. Эквивалентно получению атрибута [`__qualname__`](https://python-all.ru/3.15/reference/datamodel.html#type.__qualname__) типа.182183Добавлено в версии 3.12.184185#### `PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)`186187*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable), начиная с версии 3.13.*188189Возвращает полное квалифицированное имя типа. Эквивалентно `f"{type.__module__}.{type.__qualname__}"` или [`type.__qualname__`](https://python-all.ru/3.15/reference/datamodel.html#type.__qualname__), если [`type.__module__`](https://python-all.ru/3.15/reference/datamodel.html#type.__module__) не является строкой или равно `"builtins"`.190191Добавлено в версии 3.13.192193#### `PyObject *PyType_GetModuleName(PyTypeObject *type)`194195*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable), начиная с версии 3.13.*196197Возвращает имя модуля типа. Эквивалентно получению атрибута [`type.__module__`](https://python-all.ru/3.15/reference/datamodel.html#type.__module__).198199Добавлено в версии 3.13.200201#### `void *PyType_GetSlot(PyTypeObject *type, int slot)`202203*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.4.*204205Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен `NULL`, это означает, что либо слот `NULL`, либо функция была вызвана с недопустимыми параметрами. Обычно вызывающий код приводит указатель результата к соответствующему типу функции.206207См. [`PyType_Slot.slot`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Slot.slot) для возможных значений аргумента *slot*.208209Добавлено в версии 3.4.210211Изменено в версии 3.10: [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot) теперь может принимать все типы. Ранее он был ограничен [динамическими типами (heap types)](https://python-all.ru/3.15/c-api/typeobj.html#heap-types).212213#### `PyObject *PyType_GetModule(PyTypeObject *type)`214215*Возвращаемое значение: заимствованная ссылка.*216217*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*218219Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromModuleAndSpec).220221Возвращаемая ссылка является [заимствованной](https://python-all.ru/3.15/glossary.html#term-borrowed-reference) от *type* и будет действительна, пока существует ссылка на *type*. Не освобождайте её с помощью [`Py_DECREF()`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_DECREF) или аналогичных средств.222223Если с данным типом не связан ни один модуль, устанавливает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) и возвращает `NULL`.224225Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание, что в таком методе `PyType_GetModule(Py_TYPE(self))` может вернуть неожиданный результат. `Py_TYPE(self)` может быть *подклассом* целевого класса, а подклассы не обязательно определены в том же модуле, что и их суперкласс. См. [`PyCMethod`](https://python-all.ru/3.15/c-api/structures.html#c.PyCMethod) для получения класса, определяющего метод. См. [`PyType_GetModuleByToken()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetModuleByToken) для случаев, когда `PyCMethod` нельзя использовать.226227Добавлено в версии 3.9.228229#### `void *PyType_GetModuleState(PyTypeObject *type)`230231*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*232233Возвращает состояние объекта модуля, связанного с данным типом. Это сокращение для вызова [`PyModule_GetState()`](https://python-all.ru/3.15/c-api/module.html#c.PyModule_GetState) для результата [`PyType_GetModule()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetModule).234235Если с данным типом не связан ни один модуль, устанавливает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) и возвращает `NULL`.236237Если с *type* связан модуль, но его состояние равно `NULL`, возвращает `NULL` без установки исключения.238239Добавлено в версии 3.9.240241#### `PyObject *PyType_GetModuleByToken(PyTypeObject *type, const void *mod_token)`242243*Возвращаемое значение: новая ссылка.*244245*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*246247Находит первый суперкласс, модуль которого имеет указанный [токен модуля](https://python-all.ru/3.15/c-api/module.html#ext-module-token), и возвращает этот модуль.248249Если модуль не найден, возбуждает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) и возвращает `NULL`.250251Эта функция предназначена для использования совместно с [`PyModule_GetState()`](https://python-all.ru/3.15/c-api/module.html#c.PyModule_GetState) для получения состояния модуля из слотовых методов (таких как [`tp_init`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_init) или [`nb_add`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyNumberMethods.nb_add)) и других мест, где определяющий класс метода не может быть передан с помощью соглашения о вызове [`PyCMethod`](https://python-all.ru/3.15/c-api/structures.html#c.PyCMethod).252253Добавлено в версии 3.15.254255#### `PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)`256257*Возвращаемое значение: заимствованная ссылка.*258259*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.13.*260261Находит первый суперкласс, модуль которого был создан из указанного [`PyModuleDef`](https://python-all.ru/3.15/c-api/module.html#c.PyModuleDef) *def*, или чей [токен модуля](https://python-all.ru/3.15/c-api/module.html#ext-module-token) равен *def*, и возвращает этот модуль.262263Обратите внимание, что модули, созданные из [`PyModuleDef`](https://python-all.ru/3.15/c-api/module.html#c.PyModuleDef), всегда имеют свой токен, установленный на адрес `PyModuleDef`. Другими словами, эта функция эквивалентна [`PyType_GetModuleByToken()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetModuleByToken), за исключением того, что она:264265- возвращает заимствованную ссылку, и266- имеет тип аргумента, отличный от `void*` (что является косметическим различием в C).267268Возвращаемая ссылка является [заимствованной](https://python-all.ru/3.15/glossary.html#term-borrowed-reference) от *type* и будет действительна, пока существует ссылка на *type*. Не освобождайте её с помощью [`Py_DECREF()`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_DECREF) или аналогичных средств.269270Добавлено в версии 3.12.271272#### `int PyType_GetBaseByToken(PyTypeObject *type, void *tp_token, PyTypeObject **result)`273274*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.14.*275276Находит первый суперкласс в *type* в [порядке разрешения методов](https://python-all.ru/3.15/glossary.html#term-method-resolution-order), чей [`Py_tp_token`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_token) токен равен *tp\_token*.277278- Если найдено, установить *\*result* в новую [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на него и вернуть `1`.279- Если не найдено, установить *\*result* в `NULL` и вернуть `0`.280- При ошибке установить *\*result* в `NULL` и вернуть `-1` с установленным исключением.281282Аргумент *result* может быть равен `NULL`, и в этом случае *\*result* не устанавливается. Используйте это, если нужно только возвращаемое значение.283284Аргумент *tp\_token* не может быть равен `NULL`.285286Добавлено в версии 3.14.287288#### `int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)`289290> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*291292Пытается назначить версионный тег заданному типу.293294Возвращает 1, если тип уже имел допустимый версионный тег или был назначен новый, или 0, если новый тег не удалось назначить.295296Добавлено в версии 3.12.297298#### `int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)`299300Возвращает true, если экземпляры *type* поддерживают создание слабых ссылок, и false в противном случае. Эта функция всегда завершается успешно. *type* не должен быть `NULL`.301302> **См. также**303>304> - [Объекты слабых ссылок](https://python-all.ru/3.15/c-api/weakref.html#weakrefobjects)305> - [`weakref`](https://python-all.ru/3.15/library/weakref.html#module-weakref)306307## Создание типов, размещаемых в куче308309Следующая функция используется для создания [типов, размещаемых в куче](https://python-all.ru/3.15/c-api/typeobj.html#heap-types):310311#### `PyObject *PyType_FromSlots(const PySlot *slots)`312313*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*314315Создаёт и возвращает [тип, размещаемый в куче](https://python-all.ru/3.15/c-api/typeobj.html#heap-types), из массива `PySlot` . Смотрите [Определение слотов](https://python-all.ru/3.15/c-api/slots.html#capi-slots) для общей информации о слотах, и [Идентификаторы слотов типов](https://python-all.ru/3.15/c-api/type.html#pyslot-type-slot-ids) для слотов, специфичных для создания типов.316317Эта функция вызывает [`PyType_Ready()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Ready) у нового типа.318319Обратите внимание, что эта функция *не* полностью соответствует поведению вызова [`type()`](https://python-all.ru/3.15/library/functions.html#type) или использования оператора [`class`](https://python-all.ru/3.15/reference/compound_stmts.html#class). С пользовательскими базовыми типами или метаклассами предпочтительнее [вызов](https://python-all.ru/3.15/c-api/call.html#capi-call) `type` (или метакласса) вместо функций `PyType_From*`. В частности:320321- [`__new__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__new__) не вызывается для нового класса (и должен быть установлен в `type.__new__`).322- [`__init__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__init__) не вызывается для нового класса.323- [`__init_subclass__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__init_subclass__) не вызывается ни для каких базовых классов.324- [`__set_name__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__set_name__) не вызывается для новых дескрипторов.325326Слоты обычно определяются как глобальные статические константные массивы. Однако иногда значения слотов не известны статически на этапе компиляции. Например, такие слоты, как [`Py_tp_bases`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_bases), [`Py_tp_metaclass`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_metaclass) и [`Py_tp_module`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_module), требуют живых объектов Python. В этом случае рекомендуется размещать такие слоты на стеке и использовать [`Py_slot_subslots`](https://python-all.ru/3.15/c-api/slots.html#c.Py_slot_subslots) для ссылки на массив статических слотов. Например:327328```c329static const PySlot my_slots[] = {330   PySlot_STATIC_DATA(Py_tp_name, "MyClass"),331   PySlot_FUNC(Py_tp_repr, my_repr_func),332   ...333   PySlot_END334};335336PyObject *make_my_class(PyObject *module) {337   PySlot all_slots[] = {338      PySlot_STATIC_DATA(Py_slot_subslots, my_slots),339      PySlot_DATA(Py_tp_module, module),340      PySlot_END341   };342   return PyType_FromSlots(all_slots);343}344```345346Типы, размещаемые в куче, созданные без флага [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE), могут быть изменены, например, путём установки атрибутов, как и классы, определённые в коде Python. Иногда такие изменения необходимы для полной инициализации типа, но может потребоваться запретить пользователям изменять тип после завершения инициализации:347348#### `int PyType_Freeze(PyTypeObject *type)`349350*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.14.*351352Делает тип неизменяемым: установить флаг [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE).353354Все базовые классы *type* должны быть неизменяемыми.355356При успехе возвращает `0`. При ошибке устанавливает исключение и возвращает `-1`.357358Тип не должен использоваться до того, как он станет неизменяемым. Например, экземпляры типа не должны создаваться до того, как тип станет неизменяемым.359360Добавлено в версии 3.14.361362### Идентификаторы слотов типов363364Большинство идентификаторов слотов типов именуются по образцу названий полей структур [`PyTypeObject`](https://python-all.ru/3.15/c-api/type.html#c.PyTypeObject), [`PyNumberMethods`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyNumberMethods), [`PySequenceMethods`](https://python-all.ru/3.15/c-api/typeobj.html#c.PySequenceMethods), [`PyMappingMethods`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyMappingMethods) и [`PyAsyncMethods`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyAsyncMethods) с добавлением префикса `Py_`. Например, используйте:365366- [`Py_tp_dealloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_tp_dealloc) для установки [`PyTypeObject.tp_dealloc`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_dealloc)367- [`Py_nb_add`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_nb_add) для установки [`PyNumberMethods.nb_add`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyNumberMethods.nb_add)368- [`Py_sq_length`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_sq_length) для установки [`PySequenceMethods.sq_length`](https://python-all.ru/3.15/c-api/typeobj.html#c.PySequenceMethods.sq_length)369370Следующие слоты требуют дополнительного рассмотрения при указании в качестве слотов:371372- [`Py_tp_name`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_name)373- [`Py_tp_basicsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_basicsize) и [`Py_tp_extra_basicsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_extra_basicsize)374- [`Py_tp_itemsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_itemsize)375- [`Py_tp_flags`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_flags)376377Дополнительные слоты не соответствуют напрямую полю структуры `PyTypeObject`:378379- [`Py_tp_token`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_token)380- [`Py_tp_metaclass`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_metaclass)381- [`Py_tp_module`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_module)382383Следующие поля «offset» нельзя задать с помощью [`PyType_Slot`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Slot):384385- [`tp_weaklistoffset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) (по возможности используйте [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) вместо этого)386- [`tp_dictoffset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) (по возможности используйте [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) вместо этого)387- [`tp_vectorcall_offset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) (используйте `"__vectorcalloffset__"` в [PyMemberDef](https://python-all.ru/3.15/c-api/structures.html#pymemberdef-offsets))388389Если невозможно переключиться на флаг `MANAGED` (например, для vectorcall или для поддержки Python версии ниже 3.12), укажите смещение в [`Py_tp_members`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_tp_members). Подробнее см. [документацию PyMemberDef](https://python-all.ru/3.15/c-api/structures.html#pymemberdef-offsets).390391Следующие внутренние поля вообще нельзя задать при создании типа на куче:392393- [`tp_dict`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_dict), [`tp_mro`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_mro), [`tp_cache`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_cache), [`tp_subclasses`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_subclasses) и [`tp_weaklist`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_weaklist).394395Слот [`Py_tp_base`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_base) эквивалентен [`Py_tp_bases`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_bases); оба могут быть заданы как тип или кортеж типов. Если указаны оба, используется значение `Py_tp_bases`.396397Значения слотов не могут быть `NULL`, за исключением следующих:398399- [`Py_tp_doc`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_tp_doc)400- [`Py_tp_token`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_token) (для ясности предпочтительнее [`Py_TP_USE_SPEC`](https://python-all.ru/3.15/c-api/type.html#c.Py_TP_USE_SPEC), а не `NULL`)401402Изменено в версии 3.9: Слоты в [`PyBufferProcs`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyBufferProcs) могут быть заданы в неограниченном API.403404Изменено в версии 3.11: [`bf_getbuffer`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer) и [`bf_releasebuffer`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer) теперь доступны в рамках [ограниченного API](https://python-all.ru/3.15/c-api/stable.html#limited-c-api).405406Изменено в версии 3.14: Поле [`tp_vectorcall`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall) теперь можно задать с помощью [`Py_tp_vectorcall`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_tp_vectorcall). Подробнее см. документацию поля.407408Изменено в версии 3.15: Слот [`Py_tp_bases`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_bases) теперь может быть задан как одиночный объект типа, что делает его эквивалентным слоту [`Py_tp_base`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_base). Ранее требовался кортеж типов.409410Следующие слоты соответствуют полям в базовой структуре типа, но требуют дополнительных замечаний при использовании в качестве слотов:411412#### `Py_tp_name`413414*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*415416[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для имени типа, используется для установки [`PyTypeObject.tp_name`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_name).417418Этот слот (или [`PyType_Spec.name`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.name)) необходим для создания типа.419420Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Вместо этого используйте [`PyType_Spec.name`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.name).421422**Деталь реализации CPython:** CPython обрабатывает слоты по порядку. Рекомендуется помещать `Py_tp_name` в начало массива слотов, чтобы в случае сбоя обработки последующих слотов сообщения об ошибках содержали имя.423424Добавлено в версии 3.15.425426#### `Py_tp_basicsize`427428*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*429430[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для размера экземпляра в байтах. Используется для установки [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_basicsize).431432Значение должно быть положительным.433434Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Вместо этого используйте [`PyType_Spec.basicsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.basicsize).435436Этот слот нельзя использовать с [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot). При необходимости используйте [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_basicsize), но учтите, что размер типа часто считается деталью реализации.437438Добавлено в версии 3.15.439440#### `Py_tp_extra_basicsize`441442*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*443444[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для размера данных типа в байтах, то есть сколько пространства *в дополнение* требуется экземплярам класса сверх пространства, необходимого для суперклассов.445446Это значение используется вместе с размером суперклассов для установки [`PyTypeObject.tp_basicsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_basicsize). Python будет вставлять выравнивание по мере необходимости для соблюдения требований выравнивания `tp_basicsize`.447448Используйте [`PyObject_GetTypeData()`](https://python-all.ru/3.15/c-api/object.html#c.PyObject_GetTypeData), чтобы получить указатель на память, зарезервированную таким образом для подкласса.449450Значение должно быть положительным. Чтобы указать, что экземплярам не требуется дополнительный размер (то есть размер должен наследоваться), опустите слот `Py_tp_extra_basicsize`, а не устанавливайте его в ноль.451452Указание одновременно [`Py_tp_basicsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_basicsize) и `Py_tp_extra_basicsize` является ошибкой.453454Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Вместо этого используйте отрицательное [`PyType_Spec.basicsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.basicsize).455456Этот слот нельзя использовать с [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot).457458Добавлено в версии 3.15.459460#### `Py_tp_itemsize`461462*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*463464[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для размера одного элемента типа с изменяемым размером, в байтах. Используется для установки [`PyTypeObject.tp_itemsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_itemsize). См. документацию `tp_itemsize` о возможных ограничениях.465466Значение должно быть положительным.467468Если этот слот отсутствует, [`tp_itemsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) наследуется. Расширение произвольных классов с изменяемым размером опасно, поскольку некоторые типы используют фиксированное смещение для памяти переменного размера, которая затем может перекрываться с памятью фиксированного размера, используемой подклассом. Чтобы помочь избежать ошибок, наследование `itemsize` возможно только в следующих ситуациях:469470- Базовый класс не имеет изменяемого размера (его [`tp_itemsize`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_itemsize) равно нулю).471- Запрошенный [`PyType_Spec.basicsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.basicsize) положителен, что говорит о том, что расположение памяти базового класса известно.472- Запрошенный [`PyType_Spec.basicsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.basicsize) равен нулю, что говорит о том, что подкласс не обращается к памяти экземпляра напрямую.473- С флагом [`Py_TPFLAGS_ITEMS_AT_END`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_ITEMS_AT_END).474475Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Вместо этого используйте [`PyType_Spec.itemsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.itemsize).476477Этот слот нельзя использовать с [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot).478479Добавлено в версии 3.15.480481#### `Py_tp_flags`482483*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*484485[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для флагов типа, используется для установки [`PyTypeObject.tp_flags`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_flags).486487Флаг `Py_TPFLAGS_HEAPTYPE` не установлен, [`PyType_FromSpecWithBases()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSpecWithBases) устанавливает его автоматически.488489Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Вместо этого используйте отрицательное [`PyType_Spec.basicsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.basicsize).490491Этот слот нельзя использовать с [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot). Вместо этого используйте [`PyType_GetFlags()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetFlags).492493Добавлено в версии 3.15.494495#### `Py_tp_bases`496497*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*498499[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для флагов типа, используется для установки [`PyTypeObject.tp_bases`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_bases).500501Этот слот можно установить в кортеж объектов типа, от которых должен наследоваться вновь созданный тип, как «позиционные аргументы» [определения класса](https://python-all.ru/3.15/reference/compound_stmts.html#class) Python.502503В качестве альтернативы слот можно установить в один объект типа, чтобы указать единственный базовый класс. Эффект аналогичен указанию кортежа из одного элемента.504505Изменено в версии 3.15: Ранее `Py_tp_bases` требовал кортеж типов.506507#### `Py_tp_base`508509*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*510511Эквивалентен [`Py_tp_bases`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_bases) (с `s` в конце). Если указаны оба, `Py_tp_bases` имеет приоритет, и этот слот игнорируется.512513Изменено в версии 3.15: Ранее `Py_tp_base` требовал один тип, а не кортеж.514515[Мягкое устаревание](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) с версии 3.15: Если не требуется поддержка старых версий Python, предпочтительнее использовать `Py_tp_bases`.516517Следующие слоты не соответствуют публичным полям в нижележащих структурах:518519#### `Py_tp_metaclass`520521*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*522523[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для метакласса, используемого для создания результирующего объекта типа. Если опущен, метакласс выводится из базовых классов ([`Py_tp_bases`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_bases) или аргумента *bases* функции [`PyType_FromMetaclass()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromMetaclass)).524525Метаклассы, которые переопределяют [`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new), не поддерживаются, за исключением случаев, когда `tp_new` равно `NULL`.526527Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Используйте [`PyType_FromMetaclass()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromMetaclass), чтобы указать метакласс с `PyType_Spec`.528529Этот слот нельзя использовать с [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot). Вместо этого используйте [`Py_TYPE()`](https://python-all.ru/3.15/c-api/structures.html#c.Py_TYPE) на объекте типа.530531Добавлено в версии 3.15.532533#### `Py_tp_module`534535*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*536537[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для записи модуля, в котором определяется новый класс.538539Значение должно быть объектом модуля. Модуль связывается с новым типом и может быть впоследствии получен с помощью [`PyType_GetModule()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetModule). Связанный модуль не наследуется подклассами; его необходимо указывать для каждого класса отдельно.540541Это нельзя использовать в [`PyType_Spec.slots`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.slots). Используйте [`PyType_FromMetaclass()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromMetaclass), чтобы указать модуль с `PyType_Spec`.542543Этот слот нельзя использовать с [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot). Вместо этого используйте [`PyType_GetModule()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetModule).544545Добавлено в версии 3.15.546547#### `Py_tp_token`548549*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.14.*550551[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id) для записи идентификатора статического расположения памяти для класса.552553Если класс определён с помощью [`PyType_Spec`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec), и этот spec выделен статически, токен может быть установлен на этот spec с помощью специального значения [`Py_TP_USE_SPEC`](https://python-all.ru/3.15/c-api/type.html#c.Py_TP_USE_SPEC):554555```c556static PyType_Slot foo_slots[] = {557   {Py_tp_token, Py_TP_USE_SPEC},558```559560Его также можно установить на произвольный указатель, но необходимо убедиться, что:561562- Указатель переживает класс, чтобы он не был повторно использован для чего-то другого пока класс существует.563- Он «принадлежит» тому модулю расширения, где находится класс, чтобы не конфликтовать с другими расширениями.564565Используйте [`PyType_GetBaseByToken()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetBaseByToken), чтобы проверить, есть ли у суперкласса класса заданный токен – то есть, совместимо ли расположение памяти.566567Чтобы получить токен для заданного класса (без учёта суперклассов), используйте [`PyType_GetSlot()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_GetSlot) с `Py_tp_token`.568569Добавлено в версии 3.14.570571#### `Py_TP_USE_SPEC`572573*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.14.*574575Используется как значение с [`Py_tp_token`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_token), чтобы установить токен на [`PyType_Spec`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec) класса. Может использоваться только для классов, определённых с помощью `PyType_Spec`.576577Расширяется до `NULL`.578579Добавлено в версии 3.14.580581#### `Py_tp_slots`582583*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*584585[`Slot ID`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id), который работает как [`Py_slot_subslots`](https://python-all.ru/3.15/c-api/slots.html#c.Py_slot_subslots), за исключением того, что он задаёт массив структур [`PyType_Slot`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Slot).586587Добавлено в версии 3.15.588589## Мягко устаревшее API590591Следующие функции [мягко устарели](https://python-all.ru/3.15/glossary.html#term-soft-deprecated). Они продолжат работать, но новые возможности будут добавляться в виде слотов для [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots), а не в качестве аргументов новых функций `PyType_From*`.592593#### `PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)`594595*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.*596597Создаёт и возвращает [кучевый тип](https://python-all.ru/3.15/c-api/typeobj.html#heap-types) из *spec* (см. [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE)).598599Аргумент *метакласс*, отличный от `NULL`, соответствует слоту [`Py_tp_metaclass`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_metaclass).600601Аргумент *bases*, отличный от `NULL`, соответствует слоту [`Py_tp_bases`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_bases) и имеет приоритет над слотами `Py_tp_bases` и `Py_tp_bases`.602603Аргумент *модуль*, отличный от `NULL`, соответствует слоту [`Py_tp_module`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_module).604605Эта функция вызывает [`PyType_Ready()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Ready) у нового типа.606607Обратите внимание, что эта функция *не* полностью повторяет поведение вызова [`type()`](https://python-all.ru/3.15/library/functions.html#type) или использования оператора [`class`](https://python-all.ru/3.15/reference/compound_stmts.html#class). Подробнее см. примечание в документации [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots).608609Добавлено в версии 3.12.610611[Мягко устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) начиная с версии 3.15.0b3 (не выпущена): В новом коде рекомендуется использовать [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots).612613#### `PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)`614615*Возвращаемое значение: новая ссылка.*616617*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*618619Эквивалентно `PyType_FromMetaclass(NULL, module, spec, bases)`.620621Добавлено в версии 3.9.622623Изменено в версии 3.10: Функция теперь принимает один класс в качестве аргумента *bases* и `NULL` в качестве слота `tp_doc`.624625Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры [`type`](https://python-all.ru/3.15/library/functions.html#type).626627[`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new) метакласса *игнорируется*, что может привести к неполной инициализации. Создание классов, чей метакласс переопределяет `tp_new`, устарело.628629Изменено в версии 3.14: Создание классов, чей метакласс переопределяет [`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new), больше не разрешено.630631[Мягко устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) начиная с версии 3.15.0b3 (не выпущена): В новом коде рекомендуется использовать [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots).632633#### `PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)`634635*Возвращаемое значение: новая ссылка.*636637*Часть [стабильного ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.3.*638639Эквивалентно `PyType_FromMetaclass(NULL, NULL, spec, bases)`.640641Добавлено в версии 3.3.642643Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры [`type`](https://python-all.ru/3.15/library/functions.html#type).644645[`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new) метакласса *игнорируется*, что может привести к неполной инициализации. Создание классов, чей метакласс переопределяет `tp_new`, устарело.646647Изменено в версии 3.14: Создание классов, чей метакласс переопределяет [`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new), больше не разрешено.648649[Мягко устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) начиная с версии 3.15.0b3 (не выпущена): В новом коде рекомендуется использовать [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots).650651#### `PyObject *PyType_FromSpec(PyType_Spec *spec)`652653*Возвращаемое значение: новая ссылка.*654655*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*656657Эквивалентно `PyType_FromMetaclass(NULL, NULL, spec, NULL)`.658659Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, указанным в слотах *Py\_tp\_base\[s\]*. Ранее возвращались только экземпляры [`type`](https://python-all.ru/3.15/library/functions.html#type).660661[`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new) метакласса *игнорируется*, что может привести к неполной инициализации. Создание классов, чей метакласс переопределяет `tp_new`, устарело.662663Изменено в версии 3.14: Создание классов, чей метакласс переопределяет [`tp_new`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_new), больше не разрешено.664665[Мягко устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) начиная с версии 3.15.0b3 (не выпущена): В новом коде рекомендуется использовать [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots).666667Keep old URL fragments working (see gh-97908)668669#### `type PyType_Spec`670671*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (включая все члены).*672673Структура, определяющая поведение типа, используется для условно устаревших функций, таких как [`PyType_FromMetaclass()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromMetaclass).674675Эта структура содержит несколько членов, которые вместо этого можно указать как [slots](https://python-all.ru/3.15/c-api/type.html#pyslot-type-slot-ids) для [`PyType_FromSlots()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSlots), и массив записей слотов с более простой структурой.676677#### `const char *name`678679Соответствует [`Py_tp_name`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_name).680681#### `int basicsize`682683Если положительное, соответствует [`Py_tp_basicsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_basicsize).684685Если отрицательное, соответствует [`Py_tp_extra_basicsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_extra_basicsize), установленному в абсолютное значение.686687Изменено в версии 3.12: Ранее это поле не могло быть отрицательным.688689#### `int itemsize`690691Соответствует [`Py_tp_itemsize`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_itemsize).692693#### `unsigned int flags`694695Соответствует [`Py_tp_flags`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_flags).696697#### `PyType_Slot *slots`698699Массив структур [`PyType_Slot`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Slot) (не [`PySlot`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot)).700701Завершается специальным значением слота `{0, NULL}`. Каждый идентификатор слота должен быть указан не более одного раза.702703Keep old URL fragments working (see gh-97908)704705#### `type PyType_Slot`706707*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (включая все члены).*708709Структура, определяющая опциональную функциональность типа, используется для условно устаревших функций, таких как [`PyType_FromMetaclass()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromMetaclass).710711Обратите внимание, что массив `PyType_Slot` может быть включён в массив `PySlot` с помощью [`Py_tp_slots`](https://python-all.ru/3.15/c-api/type.html#c.Py_tp_slots), и наоборот с помощью [`Py_slot_subslots`](https://python-all.ru/3.15/c-api/slots.html#c.Py_slot_subslots).712713Каждая структура `PyType_Slot` `tpslot` интерпретируется как следующая структура [`PySlot`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot):714715```c716(PySlot){717   .sl_id=tpslot.slot,718   .sl_flags=PySlot_INTPTR | sub_static,719   .sl_ptr=tpslot.func720}721```722723где `sub_static` равно `PySlot_STATIC`, если слот требует флаг (например, для [`Py_tp_methods`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_tp_methods)), или если этот флаг присутствует в «родительском» слоте `Py_tp_slots` (если есть).724725#### `int slot`726727Соответствует [`PySlot.sl_id`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_id).728729#### `void *pfunc`730731Соответствует [`PySlot.sl_ptr`](https://python-all.ru/3.15/c-api/slots.html#c.PySlot.sl_ptr).732