Объекты типов
-
type PyTypeObject -
Часть Ограниченного API (в виде непрозрачной структуры).
Структура C для объектов, используемых для описания встроенных типов.
-
PyTypeObject PyType_Type -
Часть Стабильного ABI.
Это объект типа для объектов типов; на уровне Python это тот же объект, что и
type.
-
int PyType_Check(PyObject *o) -
Возвращает ненулевое значение, если объект o является объектом типа, включая экземпляры типов, производных от стандартного объекта типа. Во всех остальных случаях возвращает 0. Эта функция всегда выполняется успешно.
-
int PyType_CheckExact(PyObject *o) -
Возвращает ненулевое значение, если объект o является объектом типа, но не подтипом стандартного объекта типа. Во всех остальных случаях возвращает 0. Эта функция всегда выполняется успешно.
-
unsigned int PyType_ClearCache() -
Часть Стабильного ABI.
Очищает внутренний кэш поиска. Возвращает текущую метку версии.
-
unsigned long PyType_GetFlags(PyTypeObject *type) -
Часть Стабильного ABI.
Возвращает член
tp_flagsобъекта type. Эта функция предназначена главным образом для использования сPy_LIMITED_API; отдельные биты флагов гарантированно остаются стабильными в разных выпусках Python, но доступ к самомуtp_flagsне входит в ограниченный API.Добавлена в версии 3.2.
Изменено в версии 3.4: Теперь тип возвращаемого значения —
unsigned long, а неlong.
-
PyObject *PyType_GetDict(PyTypeObject *type) -
Возвращает внутреннее пространство имён объекта типа, которое в остальном доступно только через прокси только для чтения (
cls.__dict__). Эта функция заменяет прямой доступ кtp_dict. Возвращённый словарь следует считать доступным только для чтения.Эта функция предназначена для конкретных случаев встраивания и привязки языков, когда необходим прямой доступ к словарю, а косвенный доступ (например, через прокси или
PyObject_GetAttr()) недостаточен.При настройке собственных типов модули расширения должны по-прежнему использовать
tp_dictнапрямую или косвенно.Добавлена в версии 3.12.
-
void PyType_Modified(PyTypeObject *type) -
Часть Стабильного ABI.
Инвалидирует внутренний кэш поиска для типа и всех его подтипов. Эту функцию необходимо вызывать после любого ручного изменения атрибутов или базовых классов типа.
-
int PyType_AddWatcher(PyType_WatchCallback callback) -
Регистрирует callback в качестве наблюдателя типа. Возвращает неотрицательный целочисленный идентификатор, который необходимо передавать в последующие вызовы
PyType_Watch(). В случае ошибки (например, если больше нет доступных идентификаторов наблюдателей) возвращает-1и устанавливает исключение.В сборках без блокировки потоков функция
PyType_AddWatcher()не является потокобезопасной, поэтому её следует вызывать при запуске (до создания первого потока).Добавлена в версии 3.12.
-
int PyType_ClearWatcher(int watcher_id) -
Очищает наблюдателя с идентификатором watcher_id (ранее возвращённым функцией
PyType_AddWatcher()). В случае успеха возвращает0, в случае ошибки (например, если watcher_id никогда не регистрировался) —-1.Модуль расширения ни в коем случае не должен вызывать
PyType_ClearWatcherс идентификатором watcher_id, который не был возвращён ему предыдущим вызовомPyType_AddWatcher().Добавлена в версии 3.12.
-
int PyType_Watch(int watcher_id, PyObject *type) -
Помечает type как наблюдаемый. Функция обратного вызова, назначенная идентификатору watcher_id функцией
PyType_AddWatcher(), будет вызвана всякий раз, когдаPyType_Modified()сообщает об изменении type. (Функция обратного вызова может быть вызвана только один раз для последовательности изменений type, если между изменениями для type не вызывается_PyType_Lookup(); это деталь реализации, которая может измениться.)Модуль расширения ни в коем случае не должен вызывать
PyType_Watchс идентификатором watcher_id, который не был возвращён ему предыдущим вызовомPyType_AddWatcher().Добавлена в версии 3.12.
-
typedef int (*PyType_WatchCallback)(PyObject *type) -
Тип функции обратного вызова наблюдателя типа.
Функция обратного вызова не должна изменять type или вызывать
PyType_Modified()для type или любого типа в его MRO; нарушение этого правила может привести к бесконечной рекурсии.Добавлена в версии 3.12.
-
int PyType_HasFeature(PyTypeObject *o, int feature) -
Возвращает ненулевое значение, если объект типа o задаёт функцию feature. Функции типов обозначаются отдельными битовыми флагами.
-
int PyType_IS_GC(PyTypeObject *o) -
Возвращает true, если объект типа поддерживает обнаружение циклических ссылок; проверяется флаг типа
Py_TPFLAGS_HAVE_GC.
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) -
Часть Стабильного ABI.
Возвращает true, если a является подтипом b.
Эта функция проверяет только фактические подтипы, то есть для b не вызывается
__subclasscheck__(). Чтобы выполнить ту же проверку, что иissubclass(), вызвала быPyObject_IsSubclass().
-
PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) -
Возвращаемое значение: новая ссылка. Часть Стабильного ABI.
Универсальный обработчик слота
tp_allocобъекта типа. Использует стандартный механизм выделения памяти Python для выделения нового экземпляра и инициализации всего его содержимого значениемNULL.
-
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) -
Возвращаемое значение: новая ссылка. Часть Стабильного ABI.
Универсальный обработчик слота
tp_newобъекта типа. Создаёт новый экземпляр с помощью слотаtp_allocтипа.
-
int PyType_Ready(PyTypeObject *type) -
Часть Стабильного ABI.
Завершает настройку объекта типа. Эту функцию следует вызывать для всех объектов типов, чтобы завершить их инициализацию. Функция отвечает за добавление унаследованных слотов из базового класса типа. В случае успеха возвращает
0; в случае ошибки возвращает-1и устанавливает исключение.Примечание
Если некоторые из базовых классов реализуют протокол GC, а в предоставленном типе в его флагах отсутствует
Py_TPFLAGS_HAVE_GC, протокол GC будет автоматически унаследован от родительских классов. Напротив, если создаваемый тип содержитPy_TPFLAGS_HAVE_GCв своих флагах, он должен самостоятельно реализовать протокол GC, как минимум реализовав слотtp_traverse.
-
PyObject *PyType_GetName(PyTypeObject *type) -
Возвращаемое значение: новая ссылка. Часть Стабильного ABI начиная с версии 3.11.
Возвращает имя типа. Эквивалентно получению атрибута
__name__типа.Добавлена в версии 3.11.
-
PyObject *PyType_GetQualName(PyTypeObject *type) -
Возвращаемое значение: новая ссылка. Часть Стабильного ABI начиная с версии 3.11.
Возвращает квалифицированное имя типа. Эквивалентно получению атрибута
__qualname__типа.Добавлена в версии 3.11.
-
PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type) -
Часть Стабильного ABI начиная с версии 3.13.
Возвращает полное квалифицированное имя типа. Эквивалентно
f"{type.__module__}.{type.__qualname__}"илиtype.__qualname__, еслиtype.__module__не является строкой или равно"builtins".Добавлена в версии 3.13.
-
PyObject *PyType_GetModuleName(PyTypeObject *type) -
Часть Стабильного ABI начиная с версии 3.13.
Возвращает имя модуля типа. Эквивалентно получению атрибута
type.__module__.Добавлена в версии 3.13.
-
void *PyType_GetSlot(PyTypeObject *type, int slot) -
Часть Стабильного ABI начиная с версии 3.4.
Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен
NULL, это означает, что либо слот равенNULL, либо функция была вызвана с недопустимыми параметрами. Вызывающие код обычно преобразует указатель результата к соответствующему типу функции.Возможные значения аргумента slot см. в описании
PyType_Slot.slot.Добавлена в версии 3.4.
Изменено в версии 3.10: Теперь
PyType_GetSlot()принимает все типы. Ранее функция была ограничена динамическими типами.
-
PyObject *PyType_GetModule(PyTypeObject *type) -
Часть Стабильного ABI начиная с версии 3.10.
Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью
PyType_FromModuleAndSpec().Если с данным типом не связан модуль, устанавливает
TypeErrorи возвращаетNULL.Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание, что в таком методе
PyType_GetModule(Py_TYPE(self))может вернуть не тот результат, который ожидается.Py_TYPE(self)может быть подклассом предполагаемого класса, а подклассы не обязательно определены в том же модуле, что и их суперкласс. Чтобы получить класс, в котором определён метод, см.PyCMethod. Случаи, когда нельзя использоватьPyCMethod, описаны вPyType_GetModuleByDef().Добавлена в версии 3.9.
-
void *PyType_GetModuleState(PyTypeObject *type) -
Часть Стабильного ABI начиная с версии 3.10.
Возвращает состояние объекта модуля, связанного с данным типом. Это сокращённая форма вызова
PyModule_GetState()для результатаPyType_GetModule().Если с данным типом не связан модуль, устанавливает
TypeErrorи возвращаетNULL.Если с type связан модуль, но его состояние равно
NULL, возвращаетNULL, не устанавливая исключение.Добавлена в версии 3.9.
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def) -
Возвращаемое значение: заимствованная ссылка. Часть Стабильного ABI начиная с версии 3.13.
Находит первый суперкласс, модуль которого был создан из заданного
PyModuleDefdef, и возвращает этот модуль.Если модуль не найден, вызывает исключение
TypeErrorи возвращаетNULL.Эта функция предназначена для совместного использования с
PyModule_GetState()при получении состояния модуля из методов-слотов (таких какtp_initилиnb_add) и в других местах, где класс, определяющий метод, нельзя передать с помощью соглашения о вызовахPyCMethod.Возвращённая ссылка является заимствованной от type и остаётся действительной, пока у вас есть ссылка на type. Не освобождайте её с помощью
Py_DECREF()или аналогичной функции.Добавлена в версии 3.11.
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type) -
Это нестабильный API. Он может изменяться без предупреждения в промежуточных выпусках.
Пытается назначить указанному типу метку версии.
Возвращает 1, если у типа уже была действительная метка версии или была назначена новая, и 0, если новую метку назначить не удалось.
Добавлена в версии 3.12.
Создание типов, размещаемых в куче
Для создания типов в куче используются следующие функции и структуры.
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases) -
Входит в стабильный ABI начиная с версии 3.12.
Создаёт и возвращает тип в куче на основе спецификации (см.
Py_TPFLAGS_HEAPTYPE).Для создания результирующего объекта типа используется метакласс metaclass. Если metaclass равен
NULL, метакласс определяется на основе bases (или слотов Py_tp_base[s], если bases равенNULL; см. ниже).Метаклассы, переопределяющие
tp_new, не поддерживаются, кроме случая, когдаtp_newравенNULL. (Для обратной совместимости другие функцииPyType_From*допускают такие метаклассы. Они игнорируютtp_new, что может привести к неполной инициализации. Такое поведение считается устаревшим; начиная с Python 3.14 такие метаклассы не будут поддерживаться.)Аргумент bases можно использовать для указания базовых классов; он может содержать один класс или кортеж классов. Если bases равен
NULL, вместо него используется слот Py_tp_bases. Если и он равенNULL, вместо него используется слот Py_tp_base. Если и он равенNULL, новый тип наследуется отobject.Аргумент module можно использовать для указания модуля, в котором определён новый класс. Он должен быть объектом модуля или
NULL. Если он не равенNULL, модуль связывается с новым типом, и позднее его можно получить с помощьюPyType_GetModule(). Связанный модуль не наследуется подклассами; его необходимо указывать отдельно для каждого класса.Эта функция вызывает
PyType_Ready()для нового типа.Обратите внимание: поведение этой функции не полностью совпадает с вызовом
type()или использованием инструкцииclass. Если пользователь указал базовые типы или метаклассы, предпочтительнее вызыватьtype(или метакласс), а не функцииPyType_From*. В частности:-
__new__()не вызывается для нового класса (и должен быть установлен вtype.__new__). -
__init__()не вызывается для нового класса. -
__init_subclass__()не вызывается ни для одного из базовых классов. -
__set_name__()не вызывается для новых дескрипторов.
Добавлено в версии 3.12.
-
-
PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI начиная с версии 3.10.
Эквивалентно
PyType_FromMetaclass(NULL, module, spec, bases).Добавлено в версии 3.9.
Изменено в версии 3.10: Теперь функция принимает в качестве аргумента bases один класс и
NULLв качестве слотаtp_doc.Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры
type.Метод
tp_newметакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяетtp_new, считается устаревшим; начиная с Python 3.14 оно будет запрещено.
-
PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI начиная с версии 3.3.
Эквивалентно
PyType_FromMetaclass(NULL, NULL, spec, bases).Добавлено в версии 3.3.
Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры
type.Метод
tp_newметакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяетtp_new, считается устаревшим; начиная с Python 3.14 оно будет запрещено.
-
PyObject *PyType_FromSpec(PyType_Spec *spec) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Эквивалентно
PyType_FromMetaclass(NULL, NULL, spec, NULL).Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, указанным в слотах Py_tp_base[s]. Ранее возвращались только экземпляры
type.Метод
tp_newметакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяетtp_new, считается устаревшим; начиная с Python 3.14 оно будет запрещено.
-
type PyType_Spec -
Входит в стабильный ABI (включая все члены).
Структура, определяющая поведение типа.
-
const char *name -
Имя типа, используемое для установки
PyTypeObject.tp_name.
-
int basicsize -
Если значение положительное, задаёт размер экземпляра в байтах. Используется для установки
PyTypeObject.tp_basicsize.Если значение равно нулю, указывает, что следует унаследовать
tp_basicsize.Если значение отрицательное, его абсолютное значение задаёт объём памяти, необходимый экземплярам класса сверх объёма, необходимого суперклассу. Используйте
PyObject_GetTypeData(), чтобы получить указатель на зарезервированную таким образом память подкласса. При отрицательном значенииbasicsizePython при необходимости добавит выравнивающие байты, чтобы соблюсти требования к выравниваниюtp_basicsize.Изменено в версии 3.12: Ранее это поле не могло быть отрицательным.
-
int itemsize -
Размер одного элемента типа переменного размера в байтах. Используется для установки
PyTypeObject.tp_itemsize. Информацию об ограничениях см. в документацииtp_itemsize.Если значение равно нулю, наследуется
tp_itemsize. Наследование от произвольных классов переменного размера опасно: некоторые типы используют фиксированное смещение для памяти переменного размера, которое может перекрыть память фиксированного размера, используемую подклассом. Чтобы предотвратить ошибки, наследованиеitemsizeвозможно только в следующих случаях:- Базовый класс не является типом переменного размера (его
tp_itemsize). - Запрошенное значение
PyType_Spec.basicsizeположительное, что указывает на то, что структура памяти базового класса известна. - Запрошенное значение
PyType_Spec.basicsizeравно нулю, что указывает на то, что подкласс не обращается напрямую к памяти экземпляра. - При использовании флага
Py_TPFLAGS_ITEMS_AT_END.
- Базовый класс не является типом переменного размера (его
-
unsigned int flags -
Флаги типа, используемые для установки
PyTypeObject.tp_flags.Если флаг
Py_TPFLAGS_HEAPTYPEне установлен, функцияPyType_FromSpecWithBases()устанавливает его автоматически.
-
PyType_Slot *slots -
Массив структур
PyType_Slot. Завершается специальным значением слота{0, NULL}.Каждый идентификатор слота следует указывать не более одного раза.
-
-
type PyType_Slot -
Входит в стабильный ABI (включая все члены).
Структура, определяющая дополнительные возможности типа; содержит идентификатор слота и указатель на значение.
-
int slot -
Идентификатор слота.
Идентификаторы слотов имеют названия, соответствующие именам полей структур
PyTypeObject,PyNumberMethods,PySequenceMethods,PyMappingMethodsиPyAsyncMethods, с добавленным префиксомPy_. Например, используйте:-
Py_tp_deallocдля установкиPyTypeObject.tp_dealloc -
Py_nb_addдля установкиPyNumberMethods.nb_add -
Py_sq_lengthдля установкиPySequenceMethods.sq_length
Следующие поля «смещения» нельзя установить с помощью
PyType_Slot:-
tp_weaklistoffset(по возможности используйте вместо негоPy_TPFLAGS_MANAGED_WEAKREF) -
tp_dictoffset(по возможности используйте вместо негоPy_TPFLAGS_MANAGED_DICT) -
tp_vectorcall_offset(используйте"__vectorcalloffset__"в PyMemberDef)
Если перейти на флаг
MANAGEDневозможно (например, для vectorcall или для поддержки версий Python старше 3.12), укажите смещение вPy_tp_members. Подробности см. в документации PyMemberDef.При создании типа в куче нельзя установить следующие поля:
-
tp_vectorcall(используйтеtp_newи/илиtp_init) - Внутренние поля:
tp_dict,tp_mro,tp_cache,tp_subclassesиtp_weaklist.
Установка
Py_tp_basesилиPy_tp_baseможет вызвать проблемы на некоторых платформах. Во избежание проблем используйте вместо этого аргумент bases функцииPyType_FromSpecWithBases().Изменено в версии 3.9: В неограниченном API можно устанавливать слоты в
PyBufferProcs.Изменено в версии 3.11:
bf_getbufferиbf_releasebufferтеперь доступны в рамках ограниченного API. -
-
void *pfunc -
Требуемое значение слота. В большинстве случаев это указатель на функцию.
Слоты, отличные от
Py_tp_doc, не могут иметь значениеNULL.
-
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/type.html