Spec-Zone.ru › Python 3.9

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

PyTypeObject

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

PyTypeObject PyType_Type

Это объект типа для объектов типа; он совпадает с объектом type на уровне Python.

int PyType_Check(PyObject *o)

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

int PyType_CheckExact(PyObject *o)

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

unsigned int PyType_ClearCache()

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

unsigned long PyType_GetFlags(PyTypeObject* type)

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

Новое в версии 3.2.

Изменено в версии 3.4: Возвращаемый тип теперь unsigned long вместо long.

void PyType_Modified(PyTypeObject *type)

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

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)

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

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

PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Возвращаемое значение: новая ссылка.

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

PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Возвращаемое значение: новая ссылка.

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

int PyType_Ready(PyTypeObject *type)

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

Примечание

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

void* PyType_GetSlot(PyTypeObject *type, int slot)

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

См. PyType_Slot.slot для возможных значений аргумента slot.

Исключение генерируется, если type не является типом кучи.

Новое в версии 3.4.

PyObject* PyType_GetModule(PyTypeObject *type)

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

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

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

Новое в версии 3.9.

void* PyType_GetModuleState(PyTypeObject *type)

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

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

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

Новое в версии 3.9.

END_OF_DOCUMENT_MARKER

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

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

PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
Значение возврата: Новая ссылка.

Создаёт и возвращает объект типа, размещаемого в куче, из spec (Py_TPFLAGS_HEAPTYPE).

Если bases является кортежем, создаваемый тип кучи содержит все типы, содержащиеся в нём, как базовые типы.

Если bases является NULL, вместо этого используется слот Py_tp_bases. Если и он является NULL, вместо этого используется слот Py_tp_base. Если и он является NULL, новый тип наследуется от object.

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

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

Введено в версии 3.9.

PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Значение возврата: Новая ссылка.

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

Введено в версии 3.3.

PyObject* PyType_FromSpec(PyType_Spec *spec)
Значение возврата: Новая ссылка.

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

PyType_Spec

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

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}.

PyType_Slot

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

int PyType_Slot.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_Spec и PyType_Slot:

  • tp_dict
  • tp_mro
  • tp_cache
  • tp_subclasses
  • tp_weaklist
  • tp_vectorcall
  • tp_weaklistoffset (см. PyMemberDef)
  • tp_dictoffset (см. PyMemberDef)
  • tp_vectorcall_offset (см. PyMemberDef)

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

  • bf_getbuffer
  • bf_releasebuffer

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

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

void *PyType_Slot.pfunc

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

Не может быть NULL.

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/c-api/type.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API