我需要一个弱引用列表,在它们死后删除它们。目前,我唯一的方法是继续刷新列表(手动删除死引用)。
我知道有一本弱字典和一本弱价值字典,但我真的在找一个弱字典,有办法做到这一点吗?
下面是一个例子:
import weakref
class A(object):
def __init__(self):
pass
class B(object):
def __init__(self):
self._references = []
def addReference(self, obj):
self._references.append(weakref.ref(obj))
def flush(self):
toRemove = []
for ref in self._references:
if ref() is None:
toRemove.append(ref)
for item in toRemove:
self._references.remove(item)
b = B()
a1 = A()
b.addReference(a1)
a2 = A()
b.addReference(a2)
del a1
b.flush()
del a2
b.flush()
因为我需要一个像你一样的weakref列表,我已经做了一个并在pypi上发布了它。
现在你可以:
然后:
您可以使用来自同一个weakref模块的WeakSet(它实际上是在其他地方定义的,但它是在那里导入的)。
您可以自己实现它,类似于您所做的,但是使用一个在尝试访问项之前调用flush()的列表子类。
显然,您不想在每个访问上都这样做,但是您可以通过在弱引用上设置回调来优化此操作,以便在某个对象死亡时将列表标记为脏的。那么你只需要在上次访问后有东西死掉时刷新列表。
下面是一个使用此方法实现的列表类。(请注意,它没有经过太多的测试,而且一些方法的实现效率也不高(例如,那些只是转换成一个真正的列表并调用该列表上的方法的方法),但是它应该是一个合理的起点:
[编辑]添加更完整的列表实现。
相关问题 更多 >
编程相关推荐