Я хочу отслеживать объекты определенного типа, которые в настоящее время используются. Например: отслеживать все экземпляры класса или всех классов, созданных метаклассом.
Легко отслеживать такие случаи:
class A():
instances = []
def __init__(self):
self.instances.append(self)
Но если экземпляр не ссылается нигде вне этого списка, он больше не понадобится, и я не хочу обрабатывать этот экземпляр в потенциально длительном цикле.
Я попытался удалить объекты, которые упоминаются только в списке, используя 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
Проблема заключается в том, что счетчик ссылок очень неясен. Открытие новой оболочки и создание фиктивного класса без возврата контента 5 для
sys.getrefcount(DummyClass)
Другая идея - скопировать объекты, а затем удалить список и проверить, какие объекты были запланированы для сбора мусора, и на последнем этапе удалить эти объекты. Что-то вроде:
Copy = copy(A.instances)
del A.instances
A.instances = [i for i in Copy if not copy_of_i_is_in_GC(i)]
Объекты не нужно удалять сразу, когда счетчик ссылок равен 0. Я просто не хочу тратить слишком много ресурсов на объекты, которые больше не используются.