Objekte auf dem Heap zuweisen¶
-
PyObject *_PyObject_New(PyTypeObject *type)¶
- Rückgabewert: Neue Referenz.
-
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)¶
- Rückgabewert: Neue Referenz.
-
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)¶
- Rückgabewert: Ausgeliehene Referenz. Teil der Stable ABI.
Initialisiert ein neu zugewiesenes Objekt op mit seinem Typ und seiner anfänglichen Referenz. Gibt das initialisierte Objekt zurück. Andere Felder des Objekts werden nicht initialisiert. Trotz seines Namens hat diese Funktion nichts mit der Methode
__init__()des Objekts zu tun (tp_initSlot). Insbesondere ruft diese Funktion die Methode__init__()des Objekts **nicht** auf.Betrachten Sie diese Funktion im Allgemeinen als eine Low-Level-Routine. Verwenden Sie
tp_alloc, wo immer möglich. Zur Implementierung vontp_allocfür Ihren Typ bevorzugen SiePyType_GenericAlloc()oderPyObject_New().Hinweis
Diese Funktion initialisiert nur den Speicher des Objekts, der der anfänglichen Struktur
PyObjectentspricht. Der Rest wird nicht genullt.
-
PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)¶
- Rückgabewert: Ausgeliehene Referenz. Teil der Stable ABI.
Dies tut alles, was
PyObject_Init()tut, und initialisiert auch die Längeninformationen für ein Objekt variabler Größe.Hinweis
Diese Funktion initialisiert nur einen Teil des Speichers des Objekts. Der Rest wird nicht genullt.
-
PyObject_New(TYPE, typeobj)¶
Weist ein neues Python-Objekt unter Verwendung des C-Strukturtyps TYPE und des Python-Typobjekts typeobj (
PyTypeObject*) zu, indemPyObject_Malloc()aufgerufen wird, um Speicher zuzuweisen, und initialisiert ihn wiePyObject_Init(). Der Aufrufer besitzt die einzige Referenz auf das Objekt (d. h. sein Referenzzähler ist eins).Vermeiden Sie es, dies direkt aufzurufen, um Speicher für ein Objekt zuzuweisen; rufen Sie stattdessen den
tp_alloc-Slot des Typs auf.Beim Befüllen des
tp_alloc-Slots eines Typs wirdPyType_GenericAlloc()gegenüber einer benutzerdefinierten Funktion, die lediglich dieses Makro aufruft, bevorzugt.Dieses Makro ruft weder
tp_alloc, nochtp_new(__new__()), nochtp_init(__init__()) auf.Dies kann nicht für Objekte mit
Py_TPFLAGS_HAVE_GC, gesetzt intp_flags, verwendet werden; verwenden Sie stattdessenPyObject_GC_New.Speicher, der von diesem Makro zugewiesen wird, muss mit
PyObject_Free()freigegeben werden (normalerweise über dentp_free-Slot des Objekts aufgerufen).Hinweis
Es wird nicht garantiert, dass der zugewiesene Speicher vor der Initialisierung vollständig genullt wurde.
Hinweis
Dieses Makro konstruiert kein vollständig initialisiertes Objekt des angegebenen Typs; es weist lediglich Speicher zu und bereitet ihn für die weitere Initialisierung durch
tp_initvor. Um ein vollständig initialisiertes Objekt zu konstruieren, rufen Sie stattdessen typeobj auf. Zum BeispielPyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
-
PyObject_NewVar(TYPE, typeobj, size)¶
Wie
PyObject_New, außerEs weist genügend Speicher für die Struktur TYPE plus size (
Py_ssize_t) Felder der vomtp_itemsize-Feld von typeobj angegebenen Größe zu.Der Speicher wird wie
PyObject_InitVar()initialisiert.
Dies ist nützlich für die Implementierung von Objekten wie Tupeln, die ihre Größe zur Konstruktionszeit ermitteln können. Das Einbetten des Feldes in dieselbe Zuweisung verringert die Anzahl der Zuweisungen und verbessert die Effizienz der Speicherverwaltung.
Vermeiden Sie es, dies direkt aufzurufen, um Speicher für ein Objekt zuzuweisen; rufen Sie stattdessen den
tp_alloc-Slot des Typs auf.Beim Befüllen des
tp_alloc-Slots eines Typs wirdPyType_GenericAlloc()gegenüber einer benutzerdefinierten Funktion, die lediglich dieses Makro aufruft, bevorzugt.Dies kann nicht für Objekte mit
Py_TPFLAGS_HAVE_GC, gesetzt intp_flags, verwendet werden; verwenden Sie stattdessenPyObject_GC_NewVar.Speicher, der von dieser Funktion zugewiesen wird, muss mit
PyObject_Free()freigegeben werden (normalerweise über dentp_free-Slot des Objekts aufgerufen).Hinweis
Es wird nicht garantiert, dass der zugewiesene Speicher vor der Initialisierung vollständig genullt wurde.
Hinweis
Dieses Makro konstruiert kein vollständig initialisiertes Objekt des angegebenen Typs; es weist lediglich Speicher zu und bereitet ihn für die weitere Initialisierung durch
tp_initvor. Um ein vollständig initialisiertes Objekt zu konstruieren, rufen Sie stattdessen typeobj auf. Zum BeispielPyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
-
void PyObject_Del(void *op)¶
Dasselbe wie
PyObject_Free().
-
PyObject _Py_NoneStruct¶
Objekt, das in Python als
Nonesichtbar ist. Dies sollte nur mit dem MakroPy_Nonezugegriffen werden, das zu einem Zeiger auf dieses Objekt ausgewertet wird.
Siehe auch
- Modulobjekte
Zum Zuweisen und Erstellen von Erweiterungsmodulen.