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: geliehene Referenz. Teil der Stable ABI.

Initialisiert ein neu zugewiesenes Objekt op mit seinem Typ und seiner Anfangsreferenz. Gibt das initialisierte Objekt zurück. Andere Felder des Objekts werden nicht initialisiert. Trotz ihres Namens steht diese Funktion in keinem Zusammenhang mit der Methode „ __init__() “ des Objekts (Slot „tp_init “). Insbesondere ruft diese Funktion die Methode „ __init__() “ des Objekts nicht auf.

Im Allgemeinen sollten Sie diese Funktion als Low-Level-Routine betrachten. Verwenden Sie nach Möglichkeit „ tp_alloc “. Zur Implementierung von „ tp_alloc “ für Ihren Typ sollten Sie „ PyType_GenericAlloc() “ oder „ PyObject_New() “ bevorzugen.

Bemerkung

Diese Funktion initialisiert lediglich den Speicher des Objekts, der der Struktur „ PyObject “ entspricht. Der Rest wird nicht auf Null gesetzt.

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
Rückgabewert: geliehene Referenz. Teil der Stable ABI.

Diese Funktion bietet denselben Funktionsumfang wie PyObject_Init() und initialisiert darüber hinaus die Längenangaben für ein Objekt mit variabler Größe.

Bemerkung

This function only initializes some of the object’s memory. It does not zero the rest.

PyObject_New(TYPE, typeobj)

Weist ein neues Python-Objekt unter Verwendung des C-Strukturtyps TYPE und des Python-Objekttyps typeobj (PyTypeObject*) zu, indem mit PyObject_Malloc() Speicher zugewiesen und dieser wie in PyObject_Init() initialisiert wird. Der Aufrufer besitzt die einzige Referenz auf das Objekt (d.h., dessen Referenzzähler beträgt eins).

Rufe dies nicht direkt auf, um Speicher für ein Objekt zu reservieren; nutze stattdessen den tp_alloc-Slot des Typs.

Beim Befüllen des Slots tp_alloc eines Typs ist die Verwendung von PyType_GenericAlloc() einer benutzerdefinierten Funktion vorzuziehen, die dieses Makro lediglich aufruft.

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

Dies kann nicht für Objekte verwendet werden, bei denen unter tp_flags die Option „ Py_TPFLAGS_HAVE_GC “ aktiviert ist; verwenden Sie stattdessen PyObject_GC_New.

Der durch dieses Makro zugewiesene Speicher muss mit ` PyObject_Free() ` freigegeben werden (in der Regel über den Slot ` tp_free ` des Objekts aufgerufen).

Bemerkung

Es kann nicht garantiert werden, dass der zurückgegebene Speicherbereich vor der Initialisierung vollständig auf Null gesetzt wurde.

Bemerkung

Dieses Makro erstellt kein vollständig initialisiertes Objekt des angegebenen Typs; es reserviert lediglich Speicher und bereitet diesen für die weitere Initialisierung durch tp_init vor. Um ein vollständig initialisiertes Objekt zu erstellen, rufen Sie stattdessen typeobj auf. Beispiel:

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

Ähnlich wie „ PyObject_New “, nur dass:

  • Es reserviert ausreichend Speicherplatz für die Struktur TYPE sowie für size (Py_ssize_t) Felder mit der Größe, die durch das Feld „ tp_itemsize “ von typeobj angegeben wird.

  • Der Speicher wird wie folgt initialisiert: PyObject_InitVar().

Dies ist nützlich für die Implementierung von Objekten wie Tupeln, deren Größe bereits bei der Erstellung bestimmt werden kann. Durch die Einbettung des Feldarrays in denselben Speicherbereich wird die Anzahl der Speicherzuweisungen reduziert, was die Effizienz der Speicherverwaltung verbessert.

Rufe dies nicht direkt auf, um Speicher für ein Objekt zu reservieren; nutze stattdessen den tp_alloc-Slot des Typs.

Beim Befüllen des Slots tp_alloc eines Typs ist die Verwendung von PyType_GenericAlloc() einer benutzerdefinierten Funktion vorzuziehen, die dieses Makro lediglich aufruft.

Dies kann nicht für Objekte verwendet werden, bei denen unter tp_flags die Option „ Py_TPFLAGS_HAVE_GC “ aktiviert ist; verwenden Sie stattdessen PyObject_GC_NewVar.

Der von dieser Funktion zugewiesene Speicher muss mit ` PyObject_Free() ` freigegeben werden (in der Regel über den Slot ` tp_free ` des Objekts aufgerufen).

Bemerkung

Es kann nicht garantiert werden, dass der zurückgegebene Speicherbereich vor der Initialisierung vollständig auf Null gesetzt wurde.

Bemerkung

Dieses Makro erstellt kein vollständig initialisiertes Objekt des angegebenen Typs; es reserviert lediglich Speicher und bereitet diesen für die weitere Initialisierung durch tp_init vor. Um ein vollständig initialisiertes Objekt zu erstellen, rufen Sie stattdessen typeobj auf. Beispiel:

PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
PyObject _Py_NoneStruct

Objekt, das in Python als „ None “ sichtbar ist. Der Zugriff darauf sollte ausschließlich über das Makro „ Py_None “ erfolgen, das einen Zeiger auf dieses Objekt zurückgibt.

Siehe auch

Module Objects

Erweiterungsmodule zuweisen und erstellen.

Aliase, die nur noch als „Soft-Deprecated“ gelten

Dies sind Aliase für bereits vorhandene Funktionen und Makros. Sie dienen ausschließlich der Abwärtskompatibilität.

Alias, der nur noch eingeschränkt unterstützt wird

Funktion

PyObject_NEW(type, typeobj)

PyObject_New

PyObject_NEW_VAR(type, typeobj, n)

PyObject_NewVar

PyObject_INIT(op, typeobj)

PyObject_Init()

PyObject_INIT_VAR(op, typeobj, n)

PyObject_InitVar()

PyObject_MALLOC(n)

PyObject_Malloc()

PyObject_REALLOC(p, n)

PyObject_Realloc()

PyObject_FREE(p)

PyObject_Free()

PyObject_DEL(p)

PyObject_Free()

PyObject_Del(p)

PyObject_Free()