gpt4 book ai didi

类上的 Python del

转载 作者:太空狗 更新时间:2023-10-30 00:08:26 32 4
gpt4 key购买 nike

假设我们有一个 python 类:

class A(object):
def __del__(self):
print "Del!"

__del__ 在任何 A 实例的删除/垃圾收集时被调用。

是否可以对一个类(class)做同样的事情?我想在类本身被垃圾收集时调用一些方法,我假设这是在脚本导出处完成的。

在此先感谢您的指点!


编辑: 正如我预料的那样,每个人都在试图阻止我使用这种技术(我自己可能会发表这样的评论:)),尽管问题仍然存在:是吗?可能吗?

我想要以下内容:我有一个包含需要清理的静态成员的类。

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

我想调用 A.conn.close(),但就在程序关闭之前 - 即当我知道不会再有 A 实例时曾经创造过。我知道我可以用 atexit 来做到这一点,但这看起来很难看。

最佳答案

问题是类包含返回自身的循环引用 - 所以当它们被删除时它们不容易被收集 - 因此 __del__ 元类的方法不会被调用。

我可以使用 Pypy 的 Python 实现触发它被调用,但不使用 cpython - 2.6 或 3.2。甚至为了触发它,我不得不手动调用垃圾收集器 -众所周知,程序退出时的 Python 环境充满了不一致,并且在类中存在足够的内部信息以允许 sae 关闭时调用 __del__ 方法的可能性非常小。

这是我的 Pypy session ,我在其中触发了对类的调用' __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
>>>>

2022 - 从 Python 3.11 a06 开始,元类中的 __del__ 方法在 cPython 中有效,如果调用 gc.collect()在删除对该类的所有引用之后,就像这个例子中的 pypy 一样。

关于类上的 Python del,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607937/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com