这是我的问题。我启动了一个全新的 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>