2017-03-17 70 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')