Python: Как реализовать статический список в классе, ссылающийся на все созданные элементы, и простой способ удалить элементы?

1

У меня есть класс, который хранит все созданные ссылки в статическом списке следующим образом:

class A:
    _List = []

    def __init__(self):
        A._List.append(self)

    def __del__(self):
        A._List.remove(self)

Теперь, если я делаю следующее:

a = A()
del a

a не удаляется, поскольку в списке все еще имеется ссылка. Но ссылка будет уничтожена, если деструктор будет вызван. Есть ли способ каким-то образом заставить python выполнять метод __del__ в любом случае, чтобы его можно было удалить из статического списка?

Теги:
list
static
destructor

2 ответа

4
Лучший ответ

Вы можете использовать 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
1

Используйте weakref.ref(), чтобы создать слабые ссылки для сохранения в списке. Используйте обратный вызов для удаления записей из списка, когда объект больше не существует.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню