在堆上分配对象

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_alloctp_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 结构分配足够的内存,再加上 typeobjtp_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() 相同。

PyObject _Py_NoneStruct

在 Python 中显示为 None 的对象。这应仅使用 Py_None 宏访问,该宏求值为指向此对象的指针。

参见

模块对象

用于分配和创建扩展模块。