Python:如何在引用所有创建的项目的类中实现静态列表以及删除项目的简单方法?

Wol*_*tan 2 python static destructor list

我有一个类将所有创建的引用存储在一个静态列表中,如下所示:

class A:
    _List = []

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

    def __del__(self):
        A._List.remove(self)
Run Code Online (Sandbox Code Playgroud)

现在,如果我执行以下操作:

a = A()
del a
Run Code Online (Sandbox Code Playgroud)

a不会被删除,因为它仍然在列表中被引用。但是如果调用析构函数,则引用将被销毁。有没有办法以某种方式强制 python 执行该__del__方法,以便它可以从静态列表中删除?

Ros*_*ron 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)