Warum ReferenceCount hier erhöhen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Maple99
User
Beiträge: 44
Registriert: Montag 14. September 2009, 18:08

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;
}
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Maple99
User
Beiträge: 44
Registriert: Montag 14. September 2009, 18:08

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Maple99
User
Beiträge: 44
Registriert: Montag 14. September 2009, 18:08

Hi,

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

Gruß

Jonny
Antworten