Содержание страницы
Объекты типов¶Type Objects
-
type
PyTypeObject¶ - Часть Limited API (как непрозрачная структура).
C-структура объектов, используемая для описания встроенных типов.
-
PyTypeObject
PyType_Type¶ - Часть Stable ABI.
Это объект типа для объектов-типов; он совпадает с объектом
typeна уровне Python.
-
int
PyType_Check(PyObject *o)¶ Возвращает ненулевое значение, если объект o является объектом-типом, включая экземпляры типов, производных от стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.
-
int
PyType_CheckExact(PyObject *o)¶ Возвращает ненулевое значение, если объект o является объектом-типом, но не подтипом стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.
-
unsigned int
PyType_ClearCache()¶ - Часть Stable ABI.
Очищает внутренний кеш поиска. Возвращает текущий тег версии.
-
unsigned long
PyType_GetFlags(PyTypeObject *type)¶ - Часть Stable ABI.
Возвращает поле
tp_flagsтипа. Эта функция в первую очередь предназначена для использования сPy_LIMITED_API; отдельные биты флагов гарантированно стабильны в разных версиях Python, но доступ к самомуtp_flagsне входит в ограниченный API.Новое в версии 3.2.
Изменено в версии 3.4: Тип возвращаемого значения теперь
unsigned long, а неlong.
-
void
PyType_Modified(PyTypeObject *type)¶ - Часть Stable ABI.
Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.
-
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)¶ - Часть Stable ABI.
Возвращает истину, если a является подтипом b.
Эта функция проверяет только непосредственные подтипы, то есть
__subclasscheck__()не вызывается для b. ВызовитеPyObject_IsSubclass(), чтобы выполнить ту же проверку, что иissubclass().
-
PyObject *
PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)¶ - Возвращаемое значение: новая ссылка. Часть Stable ABI.
Универсальный обработчик для слота
tp_allocобъекта-типа. Использует стандартный механизм выделения памяти Python для создания нового экземпляра и инициализации всего его содержимого значениемNULL.
-
PyObject *
PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)¶ - Возвращаемое значение: новая ссылка. Часть Stable ABI.
Универсальный обработчик для слота
tp_newобъекта-типа. Создаёт новый экземпляр, используя слотtp_allocтипа.
-
int
PyType_Ready(PyTypeObject *type)¶ - Часть Stable ABI.
Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает
0при успехе, или-1и устанавливает исключение при ошибке.Примечание
If some of the base classes implements the GC protocol and the provided type does not include the
Py_TPFLAGS_HAVE_GCin its flags, then the GC protocol will be automatically implemented from its parents. On the contrary, if the type being created does includePy_TPFLAGS_HAVE_GCin its flags then it must implement the GC protocol itself by at least implementing thetp_traversehandle.
-
void *
PyType_GetSlot(PyTypeObject *type, int slot)¶ - Часть Stable ABI начиная с версии 3.4.
Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен
NULL, это означает, что либо слотNULL, либо функция была вызвана с недопустимыми параметрами. Обычно вызывающий код приводит указатель результата к соответствующему типу функции.См.
PyType_Slot.slotдля возможных значений аргумента slot.Новое в версии 3.4.
Изменено в версии 3.10:
PyType_GetSlot()теперь может принимать все типы. Ранее он был ограничен динамическими типами (heap types).
-
PyObject *
PyType_GetModule(PyTypeObject *type)¶ - Часть Stable ABI начиная с версии 3.10.
Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью
PyType_FromModuleAndSpec().Если с данным типом не связан ни один модуль, устанавливает
TypeErrorи возвращаетNULL.Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание, что в таком методе
PyType_GetModule(Py_TYPE(self))может вернуть не тот результат, который ожидается.Py_TYPE(self)может быть подклассом целевого класса, а подклассы не обязательно определены в том же модуле, что и их суперкласс. См.PyCMethod, чтобы получить класс, определяющий метод.Новое в версии 3.9.
-
void *
PyType_GetModuleState(PyTypeObject *type)¶ - Часть Stable ABI начиная с версии 3.10.
Возвращает состояние объекта модуля, связанного с данным типом. Это сокращение для вызова
PyModule_GetState()для результатаPyType_GetModule().Если с данным типом не связан ни один модуль, устанавливает
TypeErrorи возвращаетNULL.Если с type связан модуль, но его состояние равно
NULL, возвращаетNULLбез установки исключения.Новое в версии 3.9.
Создание типов, размещаемых в куче¶Creating Heap-Allocated Types
Следующие функции и структуры используются для создания динамических типов.
-
PyObject *
PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)¶ - Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.10.
Создаёт и возвращает динамический тип (heap type) из 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.
Изменено в версии 3.10: Функция теперь принимает один класс в качестве аргумента bases и
NULLв качестве слотаtp_doc.
-
PyObject *
PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)¶ - Возвращаемое значение: новая ссылка. Часть стабильного ABI начиная с версии 3.3.
Эквивалентно
PyType_FromModuleAndSpec(NULL, spec, bases).Новое в версии 3.3.
-
PyObject *
PyType_FromSpec(PyType_Spec *spec)¶ - Возвращаемое значение: новая ссылка. Часть Stable ABI.
Эквивалентно
PyType_FromSpecWithBases(spec, NULL).
-
type
PyType_Spec¶ - Часть Stable ABI (включая все члены).
Структура, определяющая поведение типа.
-
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}.
-
const char *
-
type
PyType_Slot¶ - Часть Stable ABI (включая все члены).
Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель на значение.
-
int
PyType_Slot.slot¶ Идентификатор слота.
Идентификаторы слотов именуются подобно именам полей структур
PyTypeObject,PyNumberMethods,PySequenceMethods,PyMappingMethodsиPyAsyncMethodsс добавлением префиксаPy_. Например, используйте:Py_tp_deallocдля установкиPyTypeObject.tp_deallocPy_nb_addдля установкиPyNumberMethods.nb_addPy_sq_lengthдля установкиPySequenceMethods.sq_length
Следующие поля вообще нельзя задать с помощью
PyType_SpecиPyType_Slot:tp_weaklistoffset(см. PyMemberDef)tp_dictoffset(см. PyMemberDef)
Следующие поля нельзя установить с помощью
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.
-
int