在堆上分配对象¶
-
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()相同。
参见
- 模块对象
分配内存和创建扩展模块