Seite 1 von 1

Warum ReferenceCount hier erhöhen?

Verfasst: Donnerstag 19. November 2009, 23:10
von Maple99
Hi,

ich habe mal den Beispielcode aus dem Python-Tutorial hier genommen. Kann mir jemand erklären wieso vor dem hinzufügen des Typs zum Modul ein Py_INCREF(&noddy_NoddyType); durchgeführt wird? Ist das dazu da, dass wenn man eine Instanz des Typens/Klasse erzeugt hat und jemand dann das Modul entfernt, noch immer eine Referenz auf den Typen existiert oder was soll das??

Gruß

Jonny

Code: Alles auswählen

PyMODINIT_FUNC
PyInit_noddy(void) 
{
    PyObject* m;

    noddy_NoddyType.tp_new = PyType_GenericNew;
    if (PyType_Ready(&noddy_NoddyType) < 0)
        return NULL;

    m = PyModule_Create(&noddymodule);
    if (m == NULL)
        return NULL;

    Py_INCREF(&noddy_NoddyType);
    PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType);
    return m;
}

Verfasst: Samstag 21. November 2009, 21:17
von Trundle
Hast du dir schon einmal die Dokumentation dazu durchgelesen?
This steals a reference to value.
Da deine init aber noch keine Referenz darauf besitzt, muss sie sich erst eine holen.

Verfasst: Samstag 21. November 2009, 21:21
von Maple99
Hi,

also ich hab's jetzt so verstanden, das ich mir damit erst mal einen Referenzcount erzeuge der 1 ist und das mir PyModule_AddObject() eine Referenz darauf klaut, so dass wenn das Objekt entfernt wird er den Refcount dekrementiert ohne ihn vorher inkrementiert zu haben. So wird er dann 0

Gruß

Jonny

Verfasst: Dienstag 24. November 2009, 22:38
von birkenfeld
Exakt. Der Sinn der Sache ist, dass ``PyModule_AddObject()`` normalerweise auf Objekte angewandt wird, die gerade erzeugt worden sind, z.B. mit ``PyString_FromString()``. In dem Fall gehört dir die neue Referenz auf dieses Objekt, und wenn ``PyModule_AddObject()`` sie dir nicht "abnehmen" würden, müsstest du jeweils ``Py_DECREF()`` darauf aufrufen. Ein statisches Type-Objekt ist da eine Ausnahme, da es eben nicht erzeugt wird, sondern "schon da" ist (nämlich durch seine Initialisierung), und noch keinen Reference Count hat.

Dieses Verhalten (Stehlen von Referenzen) ist übrigens die große Ausnahme; es muss in der Doku immer explizit angegeben sein.

Verfasst: Dienstag 24. November 2009, 22:49
von Maple99
Hi,

super für die Erläuterung. Dann ist's mir klar. Noch mal danke.

Gruß

Jonny