È una corretta nel precisando le ragioni seguenti:Py_INCREF/DECREF: Quando
Se un oggetto Python viene creato in una funzione C, ma la funzione non restituisce, no
INCREF
è necessario, ma unDECREF
è.[false] Se la funzione non restituirlo, si ha bisogno di
INCREF
, nella funzione che riceve il valore di ritorno. [/ False]Quando si assegna C diversi tipi di variabili come attributi, come
double
,int
ecc., Per l'oggetto Python, non è necessarioINCREF
oDECREF
.Assegnazione di oggetti Python come attributi ai vostri altri oggetti Python va in questo modo:
PyObject *foo; foo = bar // A Python object tmp = self->foo; Py_INCREF(foo); self->foo = foo; Py_XDECREF(tmp); //taken from the manual, but it is unclear if this works in every situation
EDIT: -> posso tranquillamente utilizzare questo in ogni situazione? (Non hanno eseguito in uno dove mi ha causato problemi)
- dealloc di un oggetto Python deve
DECREF
per ogni altro oggetto Python che ha come attributo, ma non per attributi che sono tipi C.
Modifica
Con 'di tipo C come un attributo' intendo bar e baz:
typedef struct {
PyObject_HEAD
PyObject *foo;
int bar;
double baz;
} FooBarBaz;
grazie, controllerò su quell'articolo. Per quanto riguarda la tua domanda sui tipi c come attributo, vedi la modifica che ho apportato. –
Giusto, perché quegli attributi sono statici e quando la memoria viene rilasciata per FooBarBaz, anche la memoria di quegli attributi andrà bene. Ora, se questi sono puntatori, devi affrontarli durante la decostruzione (quando l'oggetto viene liberato). – milkypostman