Выделение объектов в куче
-
PyObject *_PyObject_New(PyTypeObject *type) - Возвращаемое значение: новая ссылка.
-
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size) - Возвращаемое значение: новая ссылка.
-
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type) -
Возвращаемое значение: заимствованная ссылка. Часть стабильного 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) -
Возвращаемое значение: заимствованная ссылка. Часть стабильного 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);
- Выделяет достаточно памяти для структуры TYPE и size (
-
PyObject _Py_NoneStruct -
Объект, представленный в Python как
None. К нему следует обращаться только с помощью макросаPy_None, который возвращает указатель на этот объект.
См. также
- Объекты модулей
-
Выделение памяти и создание модулей расширения.
Устаревшие псевдонимы
Считается устаревшим начиная с версии 3.10.
Это псевдонимы существующих функций и макросов. Они сохранены исключительно для обратной совместимости.
Устаревший псевдоним | Функция |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
|
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/allocation.html