Содержание страницы
Выделение объектов в куче¶Allocating objects on the heap
-
PyObject *_PyObject_New(PyTypeObject *type)¶
- Возвращаемое значение: новая ссылка.
-
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)¶
- Возвращаемое значение: новая ссылка.
-
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Инициализирует недавно выделенный объект op, устанавливая его тип и начальную ссылку. Возвращает инициализированный объект. Остальные поля объекта не инициализируются. Несмотря на название, эта функция не связана с методом
__init__()объекта (слотомtp_init). В частности, эта функция не вызывает метод__init__()объекта.В целом считайте эту функцию низкоуровневой процедурой. Используйте
tp_alloc, где это возможно. Для реализацииtp_allocдля вашего типа предпочтительнееPyType_GenericAlloc()илиPyObject_New().Примечание
Эта функция инициализирует только ту память объекта, которая соответствует начальной структуре
PyObject. Остальная память не обнуляется.
-
PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Эта функция делает всё то же, что и
PyObject_Init(), а также инициализирует информацию о длине для объекта переменного размера.Примечание
Эта функция инициализирует только часть памяти объекта. Остальная память не обнуляется.
-
PyObject_New(TYPE, typeobj)¶
Выделяет новый объект Python, используя тип C-структуры TYPE и объект типа Python typeobj (
PyTypeObject*), вызываяPyObject_Malloc()для выделения памяти и инициализируя его какPyObject_Init(). Вызывающий получает единственную ссылку на объект (т.е. его счётчик ссылок будет равен единице).Избегайте прямого вызова этой функции для выделения памяти под объект; вместо этого используйте слот
tp_allocтипа.При заполнении слота
tp_allocтипа предпочтительнее использоватьPyType_GenericAlloc(), а не собственную функцию, которая просто вызывает этот макрос.Этот макрос не вызывает
tp_alloc,tp_new(__new__()) илиtp_init(__init__()).Это нельзя использовать для объектов, у которых в
tp_flagsустановленPy_TPFLAGS_HAVE_GC; вместо этого используйтеPyObject_GC_New.Память, выделенная этим макросом, должна быть освобождена с помощью
PyObject_Free()(обычно вызываемого через слотtp_freeобъекта).Примечание
Возвращаемая память не гарантированно полностью обнулена до инициализации.
Примечание
Этот макрос не создаёт полностью инициализированный объект указанного типа; он только выделяет память и подготавливает её для дальнейшей инициализации с помощью
tp_init. Для создания полностью инициализированного объекта вместо этого вызывайте typeobj. Например:PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
-
PyObject_NewVar(TYPE, typeobj, size)¶
Как
PyObject_New, за исключением:Он выделяет достаточно памяти для структуры TYPE плюс size (
Py_ssize_t) полей размером, задаваемым полемtp_itemsizeструктуры typeobj.Память инициализируется как
PyObject_InitVar().
Это полезно для реализации таких объектов, как кортежи, которые могут определить свой размер во время создания. Встраивание массива полей в то же выделение памяти уменьшает количество выделений, повышая эффективность управления памятью.
Избегайте прямого вызова этой функции для выделения памяти под объект; вместо этого используйте слот
tp_allocтипа.При заполнении слота
tp_allocтипа предпочтительнее использоватьPyType_GenericAlloc(), а не собственную функцию, которая просто вызывает этот макрос.Это нельзя использовать для объектов, у которых в
tp_flagsустановленPy_TPFLAGS_HAVE_GC; вместо этого используйтеPyObject_GC_NewVar.Память, выделенная этой функцией, должна быть освобождена с помощью
PyObject_Free()(обычно вызываемого через слотtp_freeобъекта).Примечание
Возвращаемая память не гарантированно полностью обнулена до инициализации.
Примечание
Этот макрос не создаёт полностью инициализированный объект указанного типа; он только выделяет память и подготавливает её для дальнейшей инициализации с помощью
tp_init. Для создания полностью инициализированного объекта вместо этого вызывайте typeobj. Например:PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
-
PyObject _Py_NoneStruct¶
Объект, который виден в Python как
None. Доступ к нему следует получать только через макросPy_None, который вычисляет указатель на этот объект.
См. также
- Объекты модулей
Для выделения памяти и создания модулей расширений.
Условно устаревшие псевдонимы¶Soft-deprecated aliases
Мягко устарело, начиная с версии 3.10.
Это псевдонимы существующих функций и макросов. Они существуют только для обратной совместимости.
Мягко устаревший псевдоним |
Функция |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|