在堆上分配物件¶
-
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()
相同。
參見
- 模組物件
用於分配和建立擴充套件模組。