- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我们有一个 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/
据我所知,del a 和 del(a) 似乎都具有相同的效果。如果是这样,为什么 Python 允许 del 作为语句和函数存在? 最佳答案 del 始终是一个语句。使用括号并不意味着您在进行函数调用
我已经用 Python 创建了一个列表 >>> my_list = [1, 2, 3, 4] 现在如果我想删除列表,我想使用 del 运算符,比如 >>> del my_list 这很好用并且可能是使
我在 (xx,yy) 网格中定义了一个二维函数 f(x,y)。我想在数值上获得它的偏导数,如下所示。请注意,np.gradient 不会完成这项工作,因为它返回沿每个轴的矢量场。 我该怎么做?这是我的
我有一个在 Linux 机器上运行的服务,它创建一个 命名管道 字符设备专用文件,我想编写一个 Python3 程序,通过编写文本命令和读取文本与该服务通信来自 pipe 设备的回复。我没有该服务的源
我正在尝试此代码,但它不起作用,请帮忙,jquery 新手 我的 HTML SAM C WILL HAVE BACON
这个问题在这里已经有了答案: Why does del (x) with parentheses around the variable name work? (2 个答案) "assert" st
我有一个 TimeInterval 我必须将它变成一个 String 以便它可以添加到从 Apple Watch 传递的 Dictionary通过 WatchConnectivity 连接到 iPho
我希望我的 C/M-h 键成为删除的绑定(bind)。 global-set-key 的通常解决方案对我不起作用,因为我希望这些键在任何地方都表现为删除,包括 minibuffer 和各种模式,并且能
考虑以下代码 #! /usr/bin/env python my_dict = {1:['Bernd','das','Brot'], 2:['Chili','das','Schaf'], 3:['Br
我对字典的 del 语句有问题,因为我得到了多次删除。例如我的代码如下所示: info_dict = {'parent1':{'exon':{'exon1':{'str_0':1, 'end_0':1
for x,y in words: for z in x: if z in stopwords: del x[x.index(z)] 这是我的代码。 w
今天测试一些 Python 代码,我尝试了以下代码: (以下运行在 Python 3.2+ 上,尽管以前的版本在使用 del 并且在封闭范围内引用变量时会引发 SyntaxError) def x()
我写了一个 python 脚本,可以在晚上 sleep 时备份我的文件。该程序设计为在计算机打开时运行,并在备份完成后自动关闭计算机。我的代码如下所示: from datetime import da
我对 python 和编程非常陌生。我现在正在学习循环,并尝试了以下代码来看看会发生什么。我想知道的是为什么下面的代码不会崩溃或不断重复“Robert”。 谢谢。 name = ["Robert",
在我的 python 程序中,我使用 pandas 读取一个 csv 文件并存储在内存中: data = pandas.read_csv('data.csv') 在运行上述命令之前,我使用 free
我有一个长列表,其中每个元素都是一个长度为 2 的列表。每个列表的第一个元素是一个字符串,每个列表的第二个元素是一个与字符串对应的整数。 我想遍历长长的“父”列表并删除整数小于三的任何“子”列表。这是
class ToBeDeleted: def __init__(self, value): self.value = val # Whatever... def
假设我们有一个 python 类: class A(object): def __del__(self): print "Del!" __del__ 在任何 A 实例的删除/垃
当我尝试在 lambda 中使用 del 将线程列表精简为仅运行的线程时,我注意到了一个问题: map(lambda x: del(x) if not x.isAlive() else x, self
是否有一种单行方式可以执行以下操作? myDict = {} if 'key' in myDic: del myDic['key'] 谢谢 最佳答案 你可以写 myDict.pop(key,
我是一名优秀的程序员,十分优秀!