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

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

class A:
    _List = []

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

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

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

a = A()
del a

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

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Вы можете использовать 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 голос
/ 01 июня 2011

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

...