【问题标题】:Python: automatically delete class object after return statementPython:返回语句后自动删除类对象
【发布时间】:2017-08-08 10:49:00
【问题描述】:

我有一个类,其中包含一个函数,我在其中构建和存储一个可能非常大的颠簸数组,我从 HDF5 文件中读取该数组。 (我将数组存储为类对象,这样当我从文件中读取各种 HDF5 数据集时,我可以使用列表理解而不是手动循环。)我想要同时返回和删除存储的数组(即干净在 return 语句之后占用内存)。

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 之类的东西简单地删除数组,但是有没有什么方法可以自动清理而无需我记住这样做?

谢谢!

【问题讨论】:

  • 我还在学习,所以可以使用一些说明如何/如果类对象在返回时被清理。 self.array 会从内存中清除吗? (因为 MWE 类仍然存在...)我只是想避免执行“array2 = MWE.example()”然后使用两倍的内存...
  • 等等你为什么要返回一个数组然后立即删除它。你知道同一个对象被传递给调用者而不是它的副本吗?此外 del 正在删除对对象的引用,您不会节省任何实际内存。
  • @aim 哦,刚刚看到你的评论。所以这些是参考而不是副本。在 python 中复制对象时,您通常必须执行一些非常明确的操作,例如 list_A_copy = list(list_A)dict_A_copy = {key:value for key,value in dict_A.items()}
  • 啊,好的——谢谢大家的澄清。 @GiannisSpiliopoulos - 所以如果我想做:“array2 = numpy.copy(MWE.example())”,我将如何从内存中删除 self.array? (但保持类完整,以便我可以在需要时提取其他属性......)
  • 你可以使用 del 语句删除引用,然后强制执行显式垃圾回收 import gc 然后 gc.collect()

标签: python class memory return code-cleanup


【解决方案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')

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2021-12-05
    • 1970-01-01
    • 2017-09-11
    • 2020-04-10
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多