2017-03-17 72 views
0

我有一個類,其中包含一個函數,我在其中構建並存儲一個潛在的非常大的顛簸陣列,我讀HDF5文件。 (我將數組存儲爲一個類對象,這樣當我從文件中讀取各種HDF5數據集時,我可以使用列表理解而不是手動循環。)我想要的是同時返回並刪除存儲的數組(即清理在return語句之後調用內存)。Python:返回語句後自動刪除類對象

class MWE(object): 
     def __init__(self,*args): 
      pass 
      return 

     def example(self,**kwargs): 
      self.array = readLargeArrayFromHDF5File(...) 
      return self.array # And simultaneously clean up self.array? 

我知道,我可以簡單地刪除使用類似del MWE.array在我的腳本後對數組,但有什麼辦法可以自動清理沒有我不必記住要做到這一點?

謝謝!

+0

我還在學習,所以可以使用一些關於返回時如何清理類對象的說明。 self.array會從內存中清除嗎? (因爲MWE類仍然存在...)我只是想避免「array2 = MWE.example()」,然後使用兩倍的內存... – aim

+0

等待爲什麼你會返回一個數組,然後立即刪除它。你知道同一個對象被傳遞給調用者,而不是它的副本嗎?此外德爾刪除對象的引用,你不會保存任何實際的內存。 –

+0

@aim哦,剛剛看到你的評論。所以那些參考不是副本。當在python中複製一個對象時,你通常必須做一些非常明確的事情,比如'list_A_copy = list(list_A)'或'dict_A_copy = {key:鍵的值,dict_A.items()的值}' –

回答

1

你需要使用context manager這種東西!當它離開with代碼塊時它會自動清除對象。

from contextlib import contextmanager 


class MWE(object): 

    def __init__(self, *args): 
     pass 
     return 

    @contextmanager 
    def example(self, **kwargs): 
     array = readLargeArrayFromHDF5File(...) 
     try: 
      yield array 
     finally: 
      array = None 

    @contextmanager 
    def example_two(self, **kwargs): 
     array = readLargeArrayFromHDF5File(...) 
     try: 
      for item in array: 
       yield item 
     finally: 
      array = None 
# usage 
with mwe_obj.example_two(kwargs) as result: 
    for r in result: 
     # work with your result here 
     print (r) 

# when your code hits this block self.array would get set to None 
print ('cleared large array')