Python类的实例化无需赋值 - 为什么产生的对象没有被垃圾回收?

2024-09-30 16:38:09 发布

您现在位置: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?你知道吗


Tags: instancenewobjectdefgcat垃圾me
1条回答
网友
1楼 · 发布于 2024-09-30 16:38:09

您在__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>

相关问题 更多 >