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