[英]What happens to objects when interpreter shuts down
當Python解釋器關閉時,我有點困惑對象發生了什么。 如果我這樣寫一點代碼
class MyClass(object):
def __del__(self):
print "I'm going away"
o = MyClass()
並運行它,我會得到這個
I'm going away
我的理解是,當解釋器關閉時,它將刪除對創建對象的所有引用,並且如果指定,這些對象將運行__del__()
(因為它們的引用計數為0)。
我的困惑是因為:
__del__()
文檔時,我看到了It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
而且它變得更加復雜了,他們是說由於某些周期依賴性而不能保證運行它還是只是保證了它不能運行? 誰來決定? 所以我的問題是:
__del__
guaranteed
調用它 我沒有看到的第一個問題點,但CPython的2.7.8, __del__
被稱為PyInstanceObject.instance_dealloc
,這是注冊為tp_dealloc
,當它被稱為Py_DECREF
被稱為和引用計數為零。 因此,我們只說解釋器調用了它,而不是Python代碼。 如果您問這個問題是希望您可以更改調用方式或調用時間,那么我認為這是不可能的。
至於為什么不能保證,要做到這一點,您必須在退出之前檢查所有模塊,刪除它們的變量,但是如果__del__
方法依賴於任何全局變量,則沒有簡單的方法來保證執行它們的安全順序。 我並不是說這是不可能的,就像參考循環一樣,我是說它很復雜。
我想這是在某個時候討論過的,但是社區或BDFL認為這不值得麻煩。 我相信我在幾年前看到了一些討論,但現在找不到。 首先,從不鼓勵使用__del__
方法,如果需要確保調用某些析構函數方法,則最好使用上下文管理器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.