Voglio tenere traccia degli oggetti di un certo tipo attualmente in uso. Ad esempio: Tieni traccia di tutte le istanze di una classe o di tutte le classi che sono state create da un metaclasse.In Python: come rimuovere un oggetto da un elenco se viene fatto riferimento solo a quell'elenco?
E 'facile tenere traccia di casi come questo:
class A():
instances = []
def __init__(self):
self.instances.append(self)
Ma se un istanza non viene fatto riferimento da nessuna parte al di fuori di tale elenco non sarà più necessario e non voglio per elaborare tale istanza in un ciclo potenzialmente dispendioso in termini di tempo.
Ho provato a rimuovere gli oggetti a cui viene fatto riferimento nell'elenco utilizzando sys.getrefcount.
for i in A.instances:
if sys.getrefcount(i) <=3: # in the list, in the loop and in getrefcount
# collect and remove after the loop
Il problema che ho è che il conteggio dei riferimenti è molto oscuro. apertura di una nuova shell e la creazione di una classe fittizia senza contenuti restituisce 5 per
sys.getrefcount(DummyClass)
Un'altra idea è quella di copiare gli oggetti quindi l'eliminazione della lista e di controllo che gli oggetti sono stati programmati per la raccolta dei rifiuti e, in ultima fase di rimozione quegli oggetti. Qualcosa di simile:
Copy = copy(A.instances)
del A.instances
A.instances = [i for i in Copy if not copy_of_i_is_in_GC(i)]
Gli oggetti non devono essere rimosse immediatamente quando il conteggio dei riferimenti va a 0. Solo che non voglio sprecare troppo le risorse su oggetti che non vengono più utilizzati.
Utilizzare un [riferimento debole] (https://docs.python.org/3.5/library/weakref.html) – Barmar
http://stackoverflow.com/questions/12101958/keep-track-of-instances-in -python –
http://effbot.org/pyfaq/how-do-i-get-a-list-of-all-instances-of-a-given-class.htm –