Python: 如何在类中实现一个静态列表以引用所有创建的项并方便删除它们?

2 投票
2 回答
803 浏览
提问于 2025-04-16 18:45

我有一个类,它会把所有创建的引用存储在一个静态列表里,像这样:

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 个回答

1

使用 weakref.ref() 来创建弱引用,这样可以把它们存储在列表里。当对象不再存在时,可以用一个回调函数来从列表中删除这些引用。

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

撰写回答