我有一個全局實例,我希望在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