gpt4 book ai didi

garbage-collection - 文件周围的类包装器——不再引用时关闭文件句柄的正确方法

转载 作者:太空狗 更新时间:2023-10-29 18:20:43 25 4
gpt4 key购买 nike

我有一个类包装了我需要的一些文件处理功能。另一个类创建了 filehandler 的实例,并在不确定的时间内使用它。最终,caller 被销毁,这会销毁对 filehandler 的唯一引用。

filehandler 关闭文件的最佳方法是什么?

我目前使用 __del__(self) 但在看到 several 之后different questions and articles ,我觉得这被认为是坏事

class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()

这是处理程序的相关部分。该类的全部意义在于抽象出使用底层文件对象的细节,同时避免不必要地将整个文件读入内存。但是,处理底层文件的一部分是在对象超出范围时关闭它。

caller 不应该知道或关心 filehandler 中涉及的细节。 filehandler 的工作是在它超出范围时释放所涉及的任何必要资源。这就是它首先被抽象化的原因之一。所以,我似乎面临着将 filehandler 代码移动到调用对象中,或者处理有漏洞的抽象。

想法?

最佳答案

__del__ 本身并不是坏事。您只需要格外小心,不要在定义了 __del__ 的对象中创建引用循环。如果您确实发现自己需要创建循环(父项指的是子项又指回父项),那么您将需要使用 weakref 模块。

所以,__del__ 没问题,只是要小心循环引用。

垃圾收集:这里的要点是当一个对象超出范围时,它可以被垃圾收集,事实上,它被垃圾收集。 .. 但当?无法保证何时,不同的 Python 实现在这方面有不同的特点。因此,为了管理资源,您最好明确说明并在 filehandler 上添加 .close(),或者如果您的用法兼容,则添加 __enter____exit__ 方法。

__enter__ and __exit__ methods在这里描述。关于它们的一个非常好的事情是即使在发生异常时也会调用 __exit__,因此您可以计数或优雅地关闭您的资源。

您的代码,针对 __enter__/__exit__ 进行了增强:

class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefilename = dbf
def __enter__(self):
self.thefile = open(self.thefilename, 'rb')
return self
def __exit__(self, *args):
self.thefile.close()

请注意,文件是在 __enter__ 而不是 __init__ 中打开的——这允许您创建文件处理程序对象一次,然后在需要时使用它一个 with 而无需重新创建它:

fh = filehandler('some_dbf')
with fh:
#file is now opened
#do some stuff
#file is now closed
#blah blah
#need the file again, so
with fh:
# file is open again, do some stuff with it
#etc, etc

关于garbage-collection - 文件周围的类包装器——不再引用时关闭文件句柄的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com