У меня есть класс, который хранит все созданные ссылки в статическом списке следующим образом:
class A:
_List = []
def __init__(self):
A._List.append(self)
def __del__(self):
A._List.remove(self)
Теперь, если я делаю следующее:
a = A()
del a
a
не удаляется, поскольку в списке все еще имеется ссылка. Но ссылка будет уничтожена, если деструктор будет вызван. Есть ли способ каким-то образом заставить python выполнять метод __del__
в любом случае, чтобы его можно было удалить из статического списка?
Вы можете использовать weakref.WeakValueDictionary
(или weakref.WeakKeyDictionary
), он автоматически удалит все элементы, которые больше не существуют:
class A(object):
_instances = weakref.WeakValueDictionary()
_next_id = functools.partial(next, itertools.count())
def __init__(self):
self._instances[self._next_id()] = self
Используйте weakref.ref()
, чтобы создать слабые ссылки для сохранения в списке. Используйте обратный вызов для удаления записей из списка, когда объект больше не существует.