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_init Slot). 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 von tp_alloc für Ihren Typ bevorzugen Sie PyType_GenericAlloc() oder PyObject_New().

Hinweis

Diese Funktion initialisiert nur den Speicher des Objekts, der der anfänglichen Struktur PyObject entspricht. 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, indem PyObject_Malloc() aufgerufen wird, um Speicher zuzuweisen, und initialisiert ihn wie PyObject_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 wird PyType_GenericAlloc() gegenüber einer benutzerdefinierten Funktion, die lediglich dieses Makro aufruft, bevorzugt.

Dieses Makro ruft weder tp_alloc, noch tp_new (__new__()), noch tp_init (__init__()) auf.

Dies kann nicht für Objekte mit Py_TPFLAGS_HAVE_GC, gesetzt in tp_flags, verwendet werden; verwenden Sie stattdessen PyObject_GC_New.

Speicher, der von diesem Makro zugewiesen wird, muss mit PyObject_Free() freigegeben werden (normalerweise über den tp_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_init vor. Um ein vollständig initialisiertes Objekt zu konstruieren, rufen Sie stattdessen typeobj auf. Zum Beispiel

PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
PyObject_NewVar(TYPE, typeobj, size)

Wie PyObject_New, außer

  • Es weist genügend Speicher für die Struktur TYPE plus size (Py_ssize_t) Felder der vom tp_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 wird PyType_GenericAlloc() gegenüber einer benutzerdefinierten Funktion, die lediglich dieses Makro aufruft, bevorzugt.

Dies kann nicht für Objekte mit Py_TPFLAGS_HAVE_GC, gesetzt in tp_flags, verwendet werden; verwenden Sie stattdessen PyObject_GC_NewVar.

Speicher, der von dieser Funktion zugewiesen wird, muss mit PyObject_Free() freigegeben werden (normalerweise über den tp_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_init vor. Um ein vollständig initialisiertes Objekt zu konstruieren, rufen Sie stattdessen typeobj auf. Zum Beispiel

PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
void PyObject_Del(void *op)

Dasselbe wie PyObject_Free().

PyObject _Py_NoneStruct

Objekt, das in Python als None sichtbar ist. Dies sollte nur mit dem Makro Py_None zugegriffen werden, das zu einem Zeiger auf dieses Objekt ausgewertet wird.

Siehe auch

Modulobjekte

Zum Zuweisen und Erstellen von Erweiterungsmodulen.