Объекты типов
-
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и устанавливает исключение.Добавлено в версии 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.
-
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) -
Возвращает истину, если объект типа поддерживает обнаружение циклических ссылок; для этого проверяется флаг типа
Py_TPFLAGS_HAVE_GC.
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) -
Часть Стабильного ABI.
Возвращает истину, если a является подтипом b.
Эта функция проверяет только фактические подтипы, то есть
__subclasscheck__()для b не вызывается. Чтобы выполнить ту же проверку, что и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и устанавливает исключение.Примечание
Если некоторые из базовых классов реализуют протокол сборщика мусора, а предоставленный тип не включает
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.
-
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) -
Находит первый суперкласс, модуль которого был создан из указанного
PyModuleDefdef, и возвращает этот модуль.Если модуль не найден, вызывает исключение
TypeErrorи возвращаетNULL.Эта функция предназначена для совместного использования с
PyModule_GetState()при получении состояния модуля из методов слотов (например,tp_initилиnb_add) и в других случаях, когда класс, определяющий метод, нельзя передать с помощью соглашения о вызовахPyCMethod.Добавлено в версии 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.
Создаёт и возвращает тип в куче на основе spec (см.
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(), чтобы получить указатель на зарезервированную таким образом память, предназначенную для подкласса.Изменено в версии 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/c-api/type.html