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