我有一个全局实例,我希望在Python解释器退出时销毁它(调用函数__del__
)。我是否期待太多的Python解释器? 我的测试方法是在__del__
函数中打印,从命令行运行python.exe
,然后按Ctrl/Break。此时,我希望在命令行窗口中看到打印内容。但是,我没有。Python:全局对象销毁
回答
是的,你期待太多。 Python的doesn't make any guarantees有关调用__del__
:
它不能保证
__del__()
方法要求仍然存在时解释退出的对象。
编辑:
一般来说,你应该避免使用__del__
。对于大多数情况,上下文管理者更好对于极少数情况,当您需要确保在解释器退出时清除某些外部(即从C代码分配的)资源时,可以使用atexit
module。
我的目标是在可执行实例(包含内存中的全局对象)终止之前将当前状态保存到数据库中。在析构函数中执行数据库操作在概念上是错误的吗? – 2013-03-20 23:37:17
您可以为signal.SIGBREAK
信号添加处理程序。那会让你拦截ctrl
+ break
。表格the documentation:
import signal, os
def handler(signum, frame):
print 'Someone is trying to exit!', signum
signal.signal(signal.SIGBREAK, handler)
这句柄关闭窗户呢? – 2013-03-20 23:33:04
编号@Lqc的回答更合适 – 2013-03-20 23:34:04
非常感谢! – 2013-03-20 23:39:05
- 1. 销毁对象
- 2. 对象销毁
- 3. C++销毁对象
- 4. 如何销毁PDFJS对象?
- 5. 在X ++中销毁对象
- 6. 如何销毁java对象?
- 7. RSpec与Factory_girl - 销毁对象
- 8. 销毁Oracle PLSQL对象
- 9. 何时销毁对象?
- 10. 销毁对象的::地图
- 11. 销毁对象的错误
- 12. 销毁主类对象
- 13. 销毁停用对象
- 14. 销毁Ember.js中的对象
- 15. 销毁成员对象
- 16. Unity2d - 销毁对象使用销毁(gameObject)//它会销毁与脚本连接的对象
- 17. Python全局对象变量
- 18. python全局对象缓存
- 19. 摧毁主要对象时销毁嵌入对象
- 20. 书写方法销毁并创建链接销毁对象
- 21. 父母被销毁时如何销毁子对象?
- 22. 如何销毁布局?
- 23. 销毁视图(布局)
- 24. 如何完全销毁swipe.js
- 25. 完全销毁Bootstrap标签
- 26. 销毁C中的非托管对象#
- 27. 销毁对象指针数组
- 28. 使用javascript销毁闪存对象
- 29. 统一对象已被销毁
- 30. 试图访问被销毁对象
好的,我已经注意到用Ctrl/Break(__del__未调用)和Ctrl/C(__del__调用)终止Python解释器的区别。因此,我假设Ctrl/Break杀死进程,而Ctrl/C正确结束。那么关闭窗户我应该期待什么呢? (也许这个问题应该在不同的论坛上提出)。 – 2013-03-20 23:30:18
也感兴趣:http://stackoverflow.com/q/14628486/748858 – mgilson 2013-03-20 23:41:43
另一个原因,你不应该'__del__':http://stackoverflow.com/a/14323849/748858 – mgilson 2013-03-20 23:45:29