Объекты типов
-
type PyTypeObject -
Часть ограниченного API (в виде непрозрачной структуры).
Структура C объектов, используемых для описания встроенных типов.
-
PyTypeObject PyType_Type -
Часть стабильного ABI.
Это объект типа для объектов типов; он является тем же объектом, что и
typeна уровне Python.
-
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, при ошибке —-1(например, если watcher_id никогда не регистрировался).Модуль расширения ни в коем случае не должен вызывать
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.
-
int PyType_Unwatch(int watcher_id, PyObject *type) -
Помечает type как неотслеживаемый. Отменяет предшествующий вызов
PyType_Watch(). type не должен бытьNULL.Модуль расширения ни в коем случае не должен вызывать эту функцию с идентификатором watcher_id, который не был возвращён ему предыдущим вызовом
PyType_AddWatcher().При успехе функция возвращает
0. При ошибке функция возвращает-1и устанавливает исключение.Добавлено в версии 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_FastSubclass(PyTypeObject *type, int flag) -
Возвращает ненулевое значение, если объект типа type задаёт флаг подтипа flag. Флаги подтипов обозначаются с помощью
Py_TPFLAGS_*_SUBCLASS. Эта функция используется многими функциями_Checkдля распространённых типов.См. также
PyObject_TypeCheck(), которая используется как более медленная альтернатива в функциях_Checkдля типов, не имеющих флагов подтипов.
-
int PyType_IS_GC(PyTypeObject *o) -
Возвращает true, если объект типа поддерживает обнаружение циклов; проверяется флаг типа
Py_TPFLAGS_HAVE_GC.
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) -
Часть стабильного ABI.
Возвращает true, если a является подтипом b.
Эта функция проверяет только фактические подтипы, то есть
__subclasscheck__()для b не вызывается. Чтобы выполнить ту же проверку, что иissubclass(), вызовитеPyObject_IsSubclass().
-
PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Обработчик общего назначения для слота
tp_allocобъекта типа. Использует стандартный механизм выделения памяти Python для выделения памяти под новый экземпляр, обнуляет её, а затем инициализирует, как если бы был вызванPyObject_Init()илиPyObject_InitVar().Не вызывайте эту функцию напрямую для выделения памяти под объект; вместо этого вызовите слот
tp_allocтипа.Для типов, поддерживающих сборку мусора (то есть с установленным флагом
Py_TPFLAGS_HAVE_GC), эта функция работает какPyObject_GC_NewилиPyObject_GC_NewVar(за исключением того, что память гарантированно обнуляется перед инициализацией), и её следует сочетать сPyObject_GC_Del()вtp_free. В противном случае она работает какPyObject_NewилиPyObject_NewVar(за исключением того, что память гарантированно обнуляется перед инициализацией), и её следует сочетать сPyObject_Free()вtp_free.
-
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Обработчик общего назначения для слота
tp_newобъекта типа. Создаёт новый экземпляр с помощью слотаtp_allocтипа и возвращает полученный объект.
-
int PyType_Ready(PyTypeObject *type) -
Часть стабильного ABI.
Завершает настройку объекта типа. Эту функцию следует вызывать для всех объектов типов, чтобы завершить их инициализацию. Функция отвечает за добавление унаследованных слотов из базового класса типа. При успехе возвращает
0, при ошибке возвращает-1и устанавливает исключение.Примечание
Если некоторые из базовых классов реализуют протокол сборки мусора, а предоставленный тип не содержит в своих флагах
Py_TPFLAGS_HAVE_GC, протокол сборки мусора будет автоматически реализован на основе родительских классов. Напротив, если создаваемый тип содержитPy_TPFLAGS_HAVE_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().Возвращённая ссылка заимствована у type и действительна, пока у вас есть ссылка на type. Не освобождайте её с помощью
Py_DECREF()или аналогичной функции.Если с указанным типом не связан ни один модуль, устанавливает
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 PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result) -
Часть стабильного ABI начиная с версии 3.14.
Находит первый суперкласс в порядке разрешения методов типа type, у которого токен
Py_tp_tokenсовпадает с указанным.- Если суперкласс найден, присваивает *result новую сильную ссылку на него и возвращает
1. - Если суперкласс не найден, присваивает *result значение
NULLи возвращает0. - При ошибке присваивает *result значение
NULLи возвращает-1, установив исключение.
Аргумент result может быть равен
NULL; в этом случае значение *result не устанавливается. Используйте этот вариант, если вам нужно только возвращаемое значение.Аргумент token не может быть равен
NULL.Добавлено в версии 3.14.
- Если суперкласс найден, присваивает *result новую сильную ссылку на него и возвращает
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type) -
Это нестабильный API. Он может изменяться без предупреждения в промежуточных выпусках.
Пытается присвоить указанному типу метку версии.
Возвращает 1, если тип уже имел допустимую метку версии или ему была присвоена новая, и 0, если новую метку присвоить не удалось.
Добавлено в версии 3.12.
-
int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type) -
Возвращает true, если экземпляры type поддерживают создание слабых ссылок, и false в противном случае. Эта функция всегда завершается успешно. type не должен быть
NULL.См. также
Создание типов, размещаемых в куче
Для создания типов в куче используются следующие функции и структуры.
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases) -
Входит в стабильный ABI начиная с версии 3.12.
Создаёт и возвращает тип в куче из spec (см.
Py_TPFLAGS_HEAPTYPE).Для создания результирующего объекта типа используется метакласс metaclass. Если значение metaclass равно
NULL, метакласс определяется на основе bases (или слотов Py_tp_base[s], если значение bases равноNULL; см. ниже).Метаклассы, переопределяющие
tp_new, не поддерживаются, кроме случая, когдаtp_newравноNULL.Аргумент 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, признано устаревшим.Изменено в версии 3.14: Создание классов, метакласс которых переопределяет
tp_new, больше не разрешено.
-
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, признано устаревшим.Изменено в версии 3.14: Создание классов, метакласс которых переопределяет
tp_new, больше не разрешено.
-
PyObject *PyType_FromSpec(PyType_Spec *spec) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Эквивалентна
PyType_FromMetaclass(NULL, NULL, spec, NULL).Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, заданным в слотах Py_tp_base[s]. Ранее возвращались только экземпляры
type.tp_newметакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяетtp_new, признано устаревшим.Изменено в версии 3.14: Создание классов, метакласс которых переопределяет
tp_new, больше не разрешено.
-
int PyType_Freeze(PyTypeObject *type) -
Входит в стабильный ABI начиная с версии 3.14.
Делает тип неизменяемым: устанавливает флаг
Py_TPFLAGS_IMMUTABLETYPE.Все базовые классы type должны быть неизменяемыми.
В случае успеха возвращает
0. В случае ошибки устанавливает исключение и возвращает-1.Тип нельзя использовать до того, как он станет неизменяемым. Например, до этого момента нельзя создавать экземпляры типа.
Добавлено в версии 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
Поддерживается дополнительный слот, которому не соответствует поле структуры
PyTypeObject:Следующие поля «смещения» нельзя установить с помощью
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.При создании типа в куче нельзя задать следующие внутренние поля:
Установка
Py_tp_basesилиPy_tp_baseможет вызвать проблемы на некоторых платформах. Чтобы избежать их, используйте вместо этого аргумент bases функцииPyType_FromSpecWithBases().Изменено в версии 3.9: В неограниченном API можно задавать слоты в
PyBufferProcs.Изменено в версии 3.11:
bf_getbufferиbf_releasebufferтеперь доступны в ограниченном API.Изменено в версии 3.14: Теперь поле
tp_vectorcallможно задать с помощьюPy_tp_vectorcall. Подробности см. в документации к этому полю. -
-
void *pfunc -
Требуемое значение слота. В большинстве случаев это указатель на функцию.
Значения pfunc не могут быть равны
NULL, за исключением следующих слотов:Py_tp_doc-
Py_tp_token(для ясности предпочтительнее использоватьPy_TP_USE_SPEC, а неNULL)
-
-
Py_tp_token -
Входит в стабильный ABI начиная с версии 3.14.
slot, который сохраняет идентификатор статической структуры памяти класса.Если
PyType_Specкласса размещён статически, токен можно задать равным спецификации, используя специальное значениеPy_TP_USE_SPEC:static PyType_Slot foo_slots[] = { {Py_tp_token, Py_TP_USE_SPEC},Его также можно задать равным произвольному указателю, но необходимо обеспечить следующее:
- Указатель должен существовать дольше класса, чтобы во время существования класса его не использовали повторно для чего-либо другого.
- Указатель должен «принадлежать» модулю расширения, в котором находится класс, чтобы не конфликтовать с другими расширениями.
Используйте
PyType_GetBaseByToken(), чтобы проверить, имеет ли суперкласс класса заданный токен, то есть совместима ли структура памяти.Чтобы получить токен класса (не учитывая суперклассы), используйте
PyType_GetSlot()сPy_tp_token.Добавлено в версии 3.14.
-
Py_TP_USE_SPEC -
Входит в стабильный ABI начиная с версии 3.14.
Используется как значение для
Py_tp_token, чтобы задать токен равнымPyType_Specкласса. Разворачивается вNULL.Добавлено в версии 3.14.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/type.html