我已經搜查,我無法想出任何好的理由使用Python的__enter__
/__exit__
而不是__init__
(或__new__
?)/ __del__
。Python的__enter__/__exit__ VS __init__(或__new__)/ __del__
據我所知,__enter__
/__exit__
旨在與with
語句一起用作上下文管理器,而with
語句非常好。但與此相對應的是,那些塊中的任何代碼都是在該上下文中執行的只有。通過使用這些而不是__init__
/__del__
我似乎與呼叫者創建了一個隱式合同,他們必須使用with
,但是沒有辦法執行這樣的合同,並且合同只通過文檔(或閱讀代碼)進行通信。這似乎是一個壞主意。
我似乎在with
塊內使用__init__
/__del__
獲得相同的效果。但通過使用它們而不是上下文管理方法,我的對象在其他場景中也很有用。
那麼有人可以拿出一個令人信服的理由,爲什麼我會曾經想使用上下文管理方法而不是構造/析構函數?
如果有更好的地方提出這樣的問題,請讓我知道,但似乎沒有太多關於這方面的好消息。
追問:
這個問題是基於一個壞的(但很可能常見)的假設,因爲我總是用with
實例化一個新的對象,在這種情況下__init__/__del__
非常接近相同的行爲__enter__/__exit__
(除了您無法控制何時或是否會執行__del__
,取決於垃圾回收,並且如果該進程首先終止,則可能永遠不會調用該進程)。但是如果你在with
聲明中使用預先存在的對象,它們當然是完全不同的。
何時(甚至是)'__del__'被調用是不確定的。通過依賴'__del__'進行清理,可能會丟失數據。 – user2357112
可能的重複:http://stackoverflow.com/a/6772907/674039 – wim