Документация Python неофициальный перевод
Содержание страницы

Выделение объектов в куче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.

Это псевдонимы существующих функций и макросов. Они существуют только для обратной совместимости.

Мягко устаревший псевдоним

Функция

PyObject_NEW(type, typeobj)

PyObject_New

PyObject_NEW_VAR(type, typeobj, n)

PyObject_NewVar

PyObject_INIT(op, typeobj)

PyObject_Init()

PyObject_INIT_VAR(op, typeobj, n)

PyObject_InitVar()

PyObject_MALLOC(n)

PyObject_Malloc()

PyObject_REALLOC(p, n)

PyObject_Realloc()

PyObject_FREE(p)

PyObject_Free()

PyObject_DEL(p)

PyObject_Free()

PyObject_Del(p)

PyObject_Free()