2012-11-25 12 views
7

L'interprete Python gestisce con garbo i casi in cui un'istanza dell'oggetto elimina l'ultimo riferimento a se stesso?L'oggetto cancella il riferimento a self

Si consideri il seguente modulo (certamente inutile):

all_instances = [] 

class A(object): 
    def __init__(self): 
     global all_instances 
     all_instances.append(self) 

    def delete_me(self): 
     global all_instances 
     self.context = "I'm still here" 
     all_instances.remove(self) 
     print self.context 

e ora l'utilizzo:

import the_module 
a = the_module.A() 
the_deletion_func = a.delete_me 
del a 
the_deletion_func() 

questo sarebbe ancora stampare I'm still here, ma c'è una condizione di competizione con il garbage collector di Python, che è in procinto di raccogliere l'istanza dell'oggetto?
Il riferimento alla funzione dell'oggetto salva il giorno?
L'interprete mantiene i riferimenti all'oggetto il cui codice è attualmente in esecuzione fino a quando non termina?

risposta

6

No, non ci sono tali condizioni di gara. Si sta cancellando il riferimento, quindi il conteggio degli addebiti scende a 1 e l'oggetto verrà ripulito dopo aver eliminato il riferimento al metodo.

I punti di riferimento di the_deletion_func a un metodo, che punta all'istanza (come anche alla classe), quindi c'è ancora un riferimento lì.

I metodi attualmente in esecuzione hanno una variabile locale self, che è anche un riferimento all'istanza, ma principalmente è il wrapper del metodo che fornisce tale riferimento.

Problemi correlati