Chcę śledzić obiekty pewnego rodzaju, które są obecnie w użyciu. Na przykład: Śledź wszystkie wystąpienia klasy lub wszystkich klas, które zostały utworzone przez metaclass.W języku Python: Jak usunąć obiekt z listy, jeśli jest on wymieniony tylko na tej liście?
Łatwo jest śledzić przypadkach tak:
class A():
instances = []
def __init__(self):
self.instances.append(self)
Ale jeśli instancja nie odwołuje się gdziekolwiek poza tej listy nie będą już potrzebne i nie chcę, aby przetworzyć tego wystąpienia w potencjalnie czasochłonna pętla.
Próbowałem usunąć obiekty, które są tylko przywoływane na liście przy użyciu 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
Problem polega na tym, że liczba referencyjna jest bardzo mało znana. Otwarcie nowej powłoki i tworzenie obojętne klasę bez powrotów treści 5 na
sys.getrefcount(DummyClass)
Innym pomysłem jest skopiowanie obiektów następnie usuwanie listy i sprawdziany, które obiekty zostały zaplanowane na śmieci zbieranie i w ostatnim etapie usuwania te obiekty. Coś jak:
Copy = copy(A.instances)
del A.instances
A.instances = [i for i in Copy if not copy_of_i_is_in_GC(i)]
Przedmioty nie muszą być natychmiast usunięte, gdy liczba odniesienia przechodzi do 0. Po prostu nie chcesz tracić zbyt wiele ressources na obiekty, które nie są już używane.
Użyj [słabego odnośnika] (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-i-list-all-instances-of-a-given-class.htm –