__del__
的Python文檔解釋了當對象的引用計數減爲零時,可以調用對象的__del__
方法。它是否總是立即被調用(即同步)?或者有可能將這種方法稱爲「將來的某個時刻」?python是否總是同時調用__del__?
此外,這個問題的答案是否適用於Python?或者是授予語言實現的一些緯度? (我用CPython的。)
對於這個問題,以下假設:
- 有問題的對象從
object
繼承。 - 有問題的對象有一個自定義的
__del__
實現。 - 對象的自定義
__del__
實現不會創建任何對象的新引用。 - 有問題的對象不是參考週期的一部分。
- 解釋器並未處於關閉狀態。
從我所知道的來看,圍繞這個話題似乎有很多困惑。在努力側步一些不必要的討論,讓我給不可接受的答案的一些例子:「!不要用__del__
這是令人困惑的」
- 「
- 」不要使用
__del__
!它不是'pythonic'。「 - 「請勿使用
__del__
,請改爲使用上下文管理器。」 - 如果沒有引用可信來源,任何可以斷定什麼是或不能保證的答案。 (請隨意引用其他SO答案,但不要將它們作爲您的唯一來源。在這種情況下,「可信」意味着來自文檔或信譽良好的人,或者甚至是CPython源本身。)
要改寫這個問題用一個例子,考慮下面的代碼:
class C(object):
def __init__(self, i):
self.i = i
def __del__(self):
print "C.__del__:", self.i
print "Creating list"
l = [C(0), C(1), C(2)]
print "Popping item 1"
l.pop(1)
print "Clearing list"
l = []
print "Exiting..."
產生以下輸出:
$ python test_del.py
Creating list
Popping item 1
C.__del__: 1
Clearing list
C.__del__: 2
C.__del__: 0
Exiting...
請注意,在這個例子中,__del__
是同步呼叫。這種行爲是否由語言保證? (請記住上面列出的假設。)
你的用例答案很重要? –
如果我可以依靠這種行爲,它允許一個更清潔的API設計。我沒有強迫我的圖書館的用戶記得在我給它們的對象上調用一些特殊的「cleanUp()」函數,我只需將必要的清理代碼放在__del__中即可。例如,這是C++中良好的基於RAII的API設計的基礎。 –
但是,當* __del__被調用時,知道如何改變? (在任何情況下,該對象都將被刪除*) –