2012-01-26 38 views
3

我想知道什麼時候Obj。 del()方法 即將被調用。發生break語句時發生器破壞

def my_integers(): 
    Obj = ExitObj() 
    i = 0 
    while(1): 
     yield i 
     i += 1 
def test_fun(): 
    for i in my_integers(): 
     if i > 3: 
      break 
anything_function() 
test_fun() 

我做了一個測試,Obj似乎在break語句之後被刪除:在anything_function()之前的循環中。

我可以依靠這個,並給出一些任務,當循環留給發生器中定義的對象的__ del__方法時,我想完成任務嗎?

回答

9

我想知道什麼時候Obj.__del__()方法將被調用。

你不行。它可能永遠不會。 Python中的終結器(或者在任何具有自動垃圾收集器方案的環境中)都不能保證運行,只能用於最後清理。如果您想要預測壽命管理,請使用with statementcontext managers

class Foo(object): 
    def __enter__(self): 
     print 'Entered with block' 
    def __exit__(self, *exc_info): 
     print 'Exited with block' 
     return False 

with Foo(): 
    pass 
2

一般來說,你不能依靠析構函數調用順序。當垃圾收集器回收對象時調用析構函數。這可能會在無限期的將來發生,或者根本沒有發生,如果你的程序死於例外。

如果您想爲您的對象確定一個生命週期,請考慮creating it inside a @contextmanager-decorated function並採用with語句。

0

這裏是Python語言參考不得不說回合object.__del__(self)

x.__del__() - ...當X的引用計數爲零時纔會調用。可能阻止對象的引用計數變爲零的一些常見情況包括:對象之間的循環引用;對函數的堆棧框架上的對象的引用引發異常...

因此,您不應該依賴__del__進行清理。上下文管理器(如Cat Plus Plus mentions above)是正確的選擇。

相關問題