无需分配实例化Python类-为什么不对垃圾回收对象?

时间:2018-06-20 15:14:04

标签: python garbage-collection

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

1 个答案:

答案 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>