我希望能够获取到某个类的所有现存对象实例的引用元组。我的解决方案如下:
import gc
def instances(theClass):
instances = []
gc.collect()
for i in gc.get_referrers(theClass):
if isinstance(i, theClass):
instances.append(i)
return tuple(instances)
如果在Python解释器提示符处输入上述代码,则可以执行以下操作:
>>> class MyClass(object):
>>> pass
>>> c = MyClass()
>>> instances(MyClass)
(<__main__.MyClass object at 0x100c616d0>,)
太好了。但是在函数内部似乎gc.collect()
并没有实际作用:
>>> del c
>>> instances(MyClass)
(<__main__.MyClass object at 0x100c616d0>,)
但是
gc.collect()
只能在函数外使用:>>> del c
>>> gc.collect()
>>> instances(MyClass)
()
那么,我的问题是:当在函数内部时,如何使
gc.collect()
实际执行完整的收集(为什么原来的代码不起作用)?相关问题是:是否有更好的方法来实现相同目标,即返回特定类的对象实例的元组引用?注:所有这些都是在Python 2.7.3中尝试的。我还没有在Python 3中尝试过,但我的目标是拥有一个可以在任何版本中工作的函数(或至少可以使用2to3进行转换)。
编辑(根据下面的答案)以澄清问题实际上是关于交互模式而不是
gc.collect()
函数本身。
get_referrers
输出上调用enumerate
?您从未使用索引做任何事情。 - user2357112for thing in gc.get_referrers(MyClass): if isinstance(thing, MyClass): ...
- user2357112