这是我的问题。我启动了一个新的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?
答案 0 :(得分:0)
您在meeseks_instance
中输入了__del__
,但是我认为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>