del self vs self .__ del __() – 什么是在python中清理的正确方法?
作者:互联网
我有一个包含类的python脚本.
这个类有一个__del__方法用于常规清理.如果我在正常执行脚本期间删除了类,我想要完成一些清理工作.
我也有一个信号处理程序,它做了一些不寻常的清理工作.如果脚本在收到信号时正在执行其他操作,则需要进行一些额外的清理,然后进行常规清理.
我注意到做del self和self .__ del __()之间有区别.
也就是说,self .__ del __()调用del方法两次.
你能解释一下为什么会这样吗?
这是一个模拟脚本来说明问题:
import sys
import signal
from optparse import OptionParser
class TestClass(object):
def __init__(self,
del_self):
self.del_self = del_self
print "__init__ with del_self = %s" % self.del_self
def __del__(self):
print "Now performing usual cleanup."
def signal_handler(self, arg_1, arg_2):
print "Received signal. Now performing unusual cleanup."
# Unusual cleanup
print "Did unusual cleanup"
if self.del_self:
print("Doing del self")
del self
else:
print("Doing self.__del__()")
self.__del__()
sys.exit(0)
if __name__ == '__main__':
arguments = sys.argv[1:]
parse = OptionParser("Test.")
parse.add_option(
"-d",
"--delself",
help="Set del self.",
type="int",
default=1
)
(options, _) = parse.parse_args()
print "Options: %s" % options
tc = TestClass(del_self=options.delself)
signal.signal(signal.SIGQUIT, tc.signal_handler)
while True:
pass
如果我运行脚本:
python deltest.py --delself 1
并发出killall -3 python我得到:
Received signal. Now performing unusual cleanup.
Did unusual cleanup
Doing del self
Now performing usual cleanup.
在哪里,如果我再次执行python deltest.py –delself 0后跟kill信号,我得到:
Received signal. Now performing unusual cleanup.
Did unusual cleanup
Doing self.__del__()
Now performing usual cleanup.
Now performing usual cleanup.
为什么__del__方法在这种情况下执行了两次?
谢谢!
解决方法:
del self几乎没有 – 它只删除名为self的局部变量.但由于这不是对实例的最后一次引用(无论什么叫做此方法,至少还有引用),该对象将继续存在.
除了运行该方法外,手动调用__del__也没有任何作用;它不会删除任何东西.
什么工作是删除对象的最后一个引用:在这种情况下,主方法内的del tc将删除最后一个引用,据我所知.然后该对象将被垃圾收集,然后Python调用__del__.
这就是__del__发生两次的原因:一次是手动将其称为普通函数,一次是在程序结束时对象进行垃圾回收.
标签:python,python-2-7,python-3-x,self,code-cleanup 来源: https://codeday.me/bug/20190716/1474768.html