让我们假设我们在python中有一个类:
class A(object):
def __del__(self):
print "Del!"
Run Code Online (Sandbox Code Playgroud)
__del__在删除/垃圾收集任何A实例时调用.
是否有可能为一个班级做同样的事情?我希望在类本身被垃圾收集时调用一些方法,我假设它是在脚本出口处完成的.
提前感谢任何指针!
编辑:正如我所料,每个人都试图让我远离使用这种技术(我可能会自己做出这样的评论:)),虽然问题仍然存在:是否可能?
我想要以下内容:我有一个需要清理静态成员的类.
class A(object):
class Meta(type):
def __new__(mcs, name, bases, attrs):
attrs['conn'] = sqlite3.connect( DB_FILE )
return type.__new__(mcs, name, bases, attrs)
__metaclass__ = Meta
Run Code Online (Sandbox Code Playgroud)
我希望A.conn.close()被调用,但是在程序关闭之前 - 即当我知道A不会再创建任何实例时.我知道我可以这样做atexit,但这看起来非常难看.
问题是类包含对其自身的循环引用 - 因此当它们被删除时,它们不容易被收集 - 因此__del__不会调用元类的 odf 方法。
我可以使用 Pypy 的 Python 实现触发它被调用,但不能使用 cpython - 2.6 或 3.2。即使要触发它,我也必须手动调用垃圾收集器 - 众所周知,程序退出时的 Python 环境充满了不一致之处,并且在__del__存在足够的类内部信息以允许 sae 的情况下调用该方法的可能性关闭的可能性会非常小。
这是我的 Pypy 会话,我确实触发了对班级的调用'__del__
~]$ pypy
Python 2.5.2 (78826, Nov 29 2010, 00:18:05)
[PyPy 1.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``sorry, I'll teach the cactus how
to swim later''
>>>> import gc
>>>> class Meta(type):
.... def __del__(cls):
.... print ("Arghh!!")
....
>>>> class A(object):
.... __metaclass__ = Meta
....
>>>> del A
>>>> gc.collect()
Arghh!!
0
>>>>
Run Code Online (Sandbox Code Playgroud)
2022 - 从 Python 3.11 a06 开始,__del__元类中的方法在 cPython 中工作,如果在gc.collect()删除对该类的所有引用后调用,就像本例中 pypy 发生的情况一样。