在堆上分配对象 — Python 文档

来自菜鸟教程
Python/docs/2.7/c-api/allocation
跳转至:导航、​搜索

在堆上分配对象

PyObject *_PyObject_New(PyTypeObject *type)
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)

2.5 版更改: 此函数使用 int 类型作为 大小。 这可能需要更改您的代码才能正确支持 64 位系统。

void _PyObject_Del(PyObject *op)
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
使用其类型和初始引用初始化新分配的对象 op。 返回初始化的对象。 如果 type 指示对象参与循环垃圾检测器,则将其添加到检测器的观察对象集中。 对象的其他字段不受影响。
PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)

这完成了 PyObject_Init() 所做的一切,并且还初始化了可变大小对象的长度信息。

2.5 版更改: 此函数使用 int 类型作为 大小。 这可能需要更改您的代码才能正确支持 64 位系统。

TYPE *PyObject_New(TYPE, PyTypeObject *type)
使用 C 结构类型 TYPE 和 Python 类型对象 type 分配一个新的 Python 对象。 Python 对象头未定义的字段不会被初始化; 对象的引用计数将为 1。 内存分配的大小由类型对象的 tp_basicsize 字段确定。
TYPE *PyObject_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size)

使用 C 结构类型 TYPE 和 Python 类型对象 type 分配一个新的 Python 对象。 Python 对象标头未定义的字段不会被初始化。 分配的内存允许 TYPE 结构加上 size 字段,其大小由 typetp_itemsize 字段给出。 这对于实现像元组这样的对象很有用,这些对象能够在构建时确定它们的大小。 将字段数组嵌入到同一分配中减少了分配次数,提高了内存管理效率。

2.5 版更改: 此函数使用 int 类型作为 大小。 这可能需要更改您的代码才能正确支持 64 位系统。

void PyObject_Del(PyObject *op)
使用 PyObject_New()PyObject_NewVar() 释放分配给对象的内存。 这通常从对象类型中指定的 tp_dealloc 处理程序调用。 在此调用之后不应访问对象的字段,因为内存不再是有效的 Python 对象。
PyObject *Py_InitModule(char *name, PyMethodDef *methods)

根据名称和函数表创建一个新的模块对象,返回新的模块对象。

2.3 版更改: 旧版本的 Python 不支持 NULL 作为 methods 参数的值。

PyObject *Py_InitModule3(char *name, PyMethodDef *methods, char *doc)

根据名称和函数表创建一个新的模块对象,返回新的模块对象。 如果 doc 是非 NULL,它将用于定义模块的文档字符串。

2.3 版更改: 旧版本的 Python 不支持 NULL 作为 methods 参数的值。

PyObject *Py_InitModule4(char *name, PyMethodDef *methods, char *doc, PyObject *self, int apiver)

根据名称和函数表创建一个新的模块对象,返回新的模块对象。 如果 doc 是非 NULL,它将用于定义模块的文档字符串。 如果 self 是非 NULL,它将作为它们(否则为 NULL)的第一个参数传递给模块的函数。 (这是作为实验性功能添加的,在当前版本的 Python 中没有已知用途。)对于 apiver,唯一应该传递的值由常量 PYTHON_API_VERSION 定义.

笔记

这个函数的大多数用途应该是使用 Py_InitModule3() 代替; 只有在您确定需要它时才使用它。

2.3 版更改: 旧版本的 Python 不支持 NULL 作为 methods 参数的值。

PyObject _Py_NoneStruct
在 Python 中可见的对象为 None。 这应该只能使用 Py_None 宏访问,该宏的计算结果为指向此对象的指针。