你可以考虑使用weakref.refs:
class WeakRefList(list):
def __init__(self, args):
list.__init__(self, [self.weak(item) for item in args])
def append(self, item):
list.append(self, self.weak(item))
def weak(self, item):
return weakref.ref(item, self.remove)
class Object(object):
def __init__(self, name):
self.name = name
orig = [Object('Foo'), Object('Bar')]
weaklist = WeakRefList(orig)
orig.append(Object('Baz'))
weaklist.append(orig[-1])
print(orig[0])
# <__main__.Object object at 0xb748aaac>
print(weaklist)
# [<weakref at 0xb7487a54; to 'Object' at 0xb748aaac>,
# <weakref at 0xb7487a7c; to 'Object' at 0xb748ab6c>,
# <weakref at 0xb7487aa4; to 'Object' at 0xb748ac2c>]
您调用weakref 来恢复原始对象。如果不存在,调用wearef会返回None:
print(weaklist[0]())
# <__main__.Object object at 0xb748aaac>
它返回完全相同的对象:
print(orig[0] is weaklist[0](), id(orig[0]), id(weaklist[0]()))
# (True, 3074992812L, 3074992812L)
你可以像往常一样访问它的属性(或方法):
print(weaklist[0]().name)
# Foo
for item in weaklist:
print(item)
# <weakref at 0xb7487a54; to 'Object' at 0xb748aaac>
# <weakref at 0xb7487a7c; to 'Object' at 0xb748ab6c>
# <weakref at 0xb7487aa4; to 'Object' at 0xb748ac2c>
print([item.name for item in orig])
# ['Foo', 'Bar', 'Baz']
print([item().name for item in weaklist])
# ['Foo', 'Bar', 'Baz']
最后,这是您要查找的属性:从 orig 删除项目也会自动从 weaklist 删除它们:
while orig:
item = orig.pop()
del item
print(orig)
# []
print(weaklist)
# []