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__发生两次的原因:一次是手动将其称为普通函数,一次是在程序结束时对象进行垃圾回收. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |