Типовые объекты

type PyTypeObject
Part of the Limited API (as an opaque struct).

Структура C объектов, используемых для описания встроенных типов.

PyTypeObject PyType_Type
Part of the Stable ABI.

Это объект типа для объектов типа; это тот же объект, что и type в слое Python.

int PyType_Check(PyObject *o)

Возвращает ненулевое значение, если объект o является объектом типа, включая экземпляры типов, производных от стандартного объекта типа. Во всех остальных случаях возвращается 0. Эта функция всегда успешна.

int PyType_CheckExact(PyObject *o)

Возвращает ненулевое значение, если объект o является объектом типа, но не подтипом стандартного типа object. Во всех остальных случаях возвращается 0. Эта функция всегда успешна.

unsigned int PyType_ClearCache()
Part of the Stable ABI.

Очистить внутренний кэш поиска. Вернуть текущий тег версии.

unsigned long PyType_GetFlags(PyTypeObject *type)
Part of the Stable ABI.

Возвращает член tp_flags от type. Эта функция в первую очередь предназначена для использования с Py_LIMITED_API; отдельные биты флагов гарантированно стабильны во всех выпусках Python, но доступ к tp_flags сам по себе не является частью ограниченного API.

Добавлено в версии 3.2.

Изменено в версии 3.4: Тип возврата теперь unsigned long, а не long.

void PyType_Modified(PyTypeObject *type)
Part of the Stable ABI.

Аннулировать внутренний кэш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.

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)
Part of the Stable ABI.

Возвращает true, если a является подтипом b.

Эта функция проверяет только фактические подтипы, что означает, что __subclasscheck__() не вызывается на b. Вызовите PyObject_IsSubclass(), чтобы выполнить ту же проверку, что и issubclass().

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Return value: New reference. Part of the Stable ABI.

Общий обработчик для слота tp_alloc объекта типа. Используйте механизм распределения памяти Python по умолчанию для выделения нового экземпляра и инициализации всего его содержимого в NULL.

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Return value: New reference. Part of the Stable ABI.

Общий обработчик для слота tp_new объекта типа. Создайте новый экземпляр, используя слот tp_alloc типа.

int PyType_Ready(PyTypeObject *type)
Part of the Stable ABI.

Завершить инициализацию объекта типа. Эта функция должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление унаследованных слотов от базового класса типа. Возвращает 0 при успехе, или возвращает -1 и устанавливает исключение при ошибке.

Примечание

Если какой-то из базовых классов реализует протокол GC, а создаваемый тип не включает Py_TPFLAGS_HAVE_GC в свои флаги, то протокол GC будет автоматически реализован от его родителей. Напротив, если создаваемый тип включает Py_TPFLAGS_HAVE_GC в свои флаги, то он должен сам реализовать протокол GC, по крайней мере, реализовав хэндл tp_traverse.

void *PyType_GetSlot(PyTypeObject *type, int slot)
Part of the Stable ABI since version 3.4.

Возвращает указатель функции, хранящийся в заданном слоте. Если результат равен NULL, это означает, что либо слот равен NULL, либо функция была вызвана с недопустимыми параметрами. Вызывающие функции обычно приводят указатель результата к соответствующему типу функции.

Возможные значения аргумента slot см. в PyType_Slot.slot.

Добавлено в версии 3.4.

Изменено в версии 3.10: PyType_GetSlot() теперь может принимать все типы. Ранее он был ограничен heap types.

PyObject *PyType_GetModule(PyTypeObject *type)
Part of the Stable ABI since version 3.10.

Возвращает объект модуля, связанный с данным типом, когда тип был создан с помощью PyType_FromModuleAndSpec().

Если с данным типом не связан ни один модуль, устанавливает TypeError и возвращает NULL.

Эта функция обычно используется для получения модуля, в котором определен метод. Обратите внимание, что в таком методе PyType_GetModule(Py_TYPE(self)) может не возвращать предполагаемый результат. Py_TYPE(self) может быть подклассом предполагаемого класса, а подклассы не обязательно определены в том же модуле, что и их суперкласс. Смотрите PyCMethod, чтобы получить класс, определяющий метод.

Добавлено в версии 3.9.

void *PyType_GetModuleState(PyTypeObject *type)
Part of the Stable ABI since version 3.10.

Возвращает состояние объекта модуля, связанного с заданным типом. Это сокращение для вызова PyModule_GetState() на результат PyType_GetModule().

Если с данным типом не связан ни один модуль, устанавливает TypeError и возвращает NULL.

Если тип имеет связанный модуль, но его состояние NULL, возвращает NULL без установки исключения.

Добавлено в версии 3.9.

Создание типов, распределенных по куче

Для создания heap types используются следующие функции и структуры.

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
Return value: New reference. Part of the Stable ABI since version 3.10.

Создает и возвращает heap type из спека (Py_TPFLAGS_HEAPTYPE).

Аргумент bases может использоваться для указания базовых классов; это может быть либо только один класс, либо кортеж классов. Если bases имеет значение NULL, вместо него используется слот Py_tp_bases. Если это также NULL, вместо него используется слот Py_tp_base. Если это также NULL, то новый тип происходит от object.

Аргумент module может использоваться для записи модуля, в котором определен новый класс. Это должен быть объект модуля или NULL. Если не NULL, модуль ассоциируется с новым типом и может быть позже получен с помощью PyType_GetModule(). Ассоциированный модуль не наследуется подклассами; он должен быть указан для каждого класса отдельно.

Эта функция вызывает PyType_Ready() на новом типе.

Добавлено в версии 3.9.

Изменено в версии 3.10: Теперь функция принимает один класс в качестве аргумента bases и NULL в качестве слота tp_doc.

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Return value: New reference. Part of the Stable ABI since version 3.3.

Эквивалентно PyType_FromModuleAndSpec(NULL, spec, bases).

Добавлено в версии 3.3.

PyObject *PyType_FromSpec(PyType_Spec *spec)
Return value: New reference. Part of the Stable ABI.

Эквивалентно PyType_FromSpecWithBases(spec, NULL).

type PyType_Spec
Part of the Stable ABI (including all members).

Структура, определяющая поведение типа.

const char *PyType_Spec.name

Имя типа, используемое для установки PyTypeObject.tp_name.

int PyType_Spec.basicsize
int PyType_Spec.itemsize

Размер экземпляра в байтах, используется для установки PyTypeObject.tp_basicsize и PyTypeObject.tp_itemsize.

int PyType_Spec.flags

Флаги типа, используемые для установки PyTypeObject.tp_flags.

Если флаг Py_TPFLAGS_HEAPTYPE не установлен, то PyType_FromSpecWithBases() устанавливает его автоматически.

PyType_Slot *PyType_Spec.slots

Массив структур PyType_Slot. Завершается специальным значением слота {0, NULL}.

type PyType_Slot
Part of the Stable ABI (including all members).

Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель значения.

int PyType_Slot.slot

Идентификатор слота.

Идентификаторы слотов называются подобно именам полей структур PyTypeObject, PyNumberMethods, PySequenceMethods, PyMappingMethods и PyAsyncMethods с добавленным префиксом Py_. Например, используйте:

Следующие поля вообще не могут быть установлены с помощью PyType_Spec и PyType_Slot:

Следующие поля не могут быть установлены с помощью PyType_Spec и PyType_Slot при ограниченном API:

Установка Py_tp_bases или Py_tp_base может быть проблематичной на некоторых платформах. Чтобы избежать проблем, используйте вместо этого аргумент bases в PyType_FromSpecWithBases().

Изменено в версии 3.9: Слоты в PyBufferProcs могут быть установлены в неограниченном API.

void *PyType_Slot.pfunc

Желаемое значение слота. В большинстве случаев это указатель на функцию.

Слоты, отличные от Py_tp_doc, не могут быть NULL.

Вернуться на верх