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 solltest du diese Funktion als Low-Level-Routine
   betrachten. Verwende nach Möglichkeit „ "tp_alloc" “. Zur
   Implementierung von „ "tp_alloc" “ für deinen Typ solltest du „
   "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:

     Diese Funktion initialisiert nur einen Teil des Speichers des
     Objekts. Der Rest wird nicht auf Null gesetzt.

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.
   Verwende 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, rufe
     stattdessen *typeobj* auf. Beispiel:

        PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);

   Siehe auch:

     * "PyObject_Free()"

     * "PyObject_GC_New"

     * "PyType_GenericAlloc()"

     * "tp_alloc"

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.
   Verwende 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, rufe
     stattdessen *typeobj* auf. Beispiel:

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

   Siehe auch:

     * "PyObject_Free()"

     * "PyObject_GC_NewVar"

     * "PyType_GenericAlloc()"

     * "tp_alloc"

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
=================================================

Sanft abgekündigt <Soft deprecated> seit Version 3.15.

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()"                                  |
+----------------------------------------------------+----------------------------------------------------+
