在堆上分配对象¶
-
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)¶
通过调用
PyObject_Malloc()
分配内存并像PyObject_Init()
那样初始化,使用 C 结构类型 TYPE 和 Python 类型对象 typeobj (PyTypeObject*
) 分配一个新的 Python 对象。调用者将拥有对该对象的唯一引用(即其引用计数将为一)。避免直接调用此宏来为对象分配内存;请改为调用类型的
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 结构分配足够的内存,再加上 typeobj 的
tp_itemsize
字段给出的大小所表示的 size (Py_ssize_t
) 字段。内存像
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);
-
void PyObject_Del(void *op)¶
与
PyObject_Free()
相同。
参见
- 模块对象
用于分配和创建扩展模块。