在没有赋值的情况下实例化 Python 类 - 为什么生成的对象没有垃圾回收?



这是我的问题。我启动了一个全新的 python 控制台,然后输入以下内容:

import gc
meeseeks_instance = False
class Meeseeks(object):
def __init__(self):
gc.collect()
print('Look at me!')
def __del__(self):
print('Mission accomplished!')
globals()['meeseks_instance'] = False
def __new__(cls):
gc.collect()
if globals()['meeseeks_instance']:
raise Exception('Theres already a Meeseeks!')
globals()['meeseeks_instance'] = True
return super().__new__(cls)

现在,如果我输入:

>>> mymeeseeks = Meeseeks()
Look at me!
>>> del mymeeseeks
Mission accomplished!

匪夷所思。现在:

>>> Meeseeks()
Look at me!
<Meeseeks object at 0x043DE290>

该对象未分配,因此无法访问,应该对其进行垃圾袋收集;无论如何,垃圾回收似乎尚未运行。但是,如果我强制它,对象就会被正确收集:

>>> gc.collect()
Mission accomplished!
0

麻烦开始了。如果我尝试实例化两个Meeseeks__new__中的显式垃圾收集不会触发,并且会引发异常:

>>> Meeseeks()
Look at me!
<Meeseeks object at 0x043B0990>
>>> Meeseeks()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 18, in __new__
Exception: Theres already a Meeseeks!

为什么会这样?我怎样才能使尝试实例化新的Meeseeks强制垃圾收集以前无法访问的Meeseeks?

你在__del__中犯了一个meeseks_instance的错字,但此外,我认为python垃圾收集的默认行为已经如你所愿地工作了。

>>> class Meeseeks(object):
...     def __init__(self):
...         print('Initiating %s' % self)
...     def __del__(self):
...         print('Deleting %s' % self)
...
>>> Meeseeks();Meeseeks()
Initiating <__main__.Meeseeks object at 0x00E88C70>
<__main__.Meeseeks object at 0x00E88C70>
Initiating <__main__.Meeseeks object at 0x00ECA1D0>
Deleting <__main__.Meeseeks object at 0x00E88C70>
<__main__.Meeseeks object at 0x00ECA1D0>

最新更新