- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类包装了我需要的一些文件处理功能。另一个类创建了 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/
我目前有一堆看起来像这样的行: txt = "Can't print the value for "+arguments[1]+" before it's set"; 我在做 $('#mydiv').
我有一个网站,我试图以移动格式显示,但在宽屏幕上显示。我确信 iframe 是要走的路。 我正在尝试将 iframe 加载到 iPhone 的图像中。你可以看到一个例子 here . 一旦你看到它,你
我正在尝试使用 Xcode 中的 Storyboard创建如下所示的 View 。 为此,我添加了一个按钮和一个带有约束的标签,但这就是我得到的结果。文本不会从复选框下方开始。实现此目的的一种方法是创
我正在与 css 斗争以将文本包装在 div 中。我应用了空格、分词但没有任何反应。 链接 http://fiduciaryconsulting.org/index.php/services/90-s
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
正如标题所说 - 如何将文本环绕在伪元素周围?请参见下面的示例: .area { position: relative; } .area:before { content: '';
每次我尝试在 CSS 中做一些看似简单的事情时,它都行不通。 我有一个包含 460x160 图像的内容 div。我想做的就是将图片放在右下角,然后用文字环绕它。 text text
每次我尝试在 CSS 中做一些看似简单的事情时,它都行不通。 我有一个包含 460x160 图像的内容 div。我想做的就是将图片放在右下角,然后用文字环绕它。 text text
我有一个流式布局,它已经为我工作了一段时间。我漂浮 不是右就是左。一个 div 通常会有一个图像和一个标题。 文本项正确地环绕在 float 周围。但是某些元素没有: 将做以下两件事之一:他们要么侵入
这是我的问题。我在另一个 div 中有内联 block div。 .timeEvents { width: 100%; overflow: hidden; text-align: cent
使用float,我可以让文本环绕figure标签中的图像,而不是环绕figcaption标签,因为出色地。将 float 添加到 figcaption 不会这样做。有什么建议吗? 下面的代码在这里:h
如何让 div 2 环绕 div 1 ? (两个 div 都包含文本) +---++------------------+ | || | | 1 ||
我有一个场景,我需要转换一个可以被 *this 链接的函数返回 std::optional>而不是 T& (原因超出了这个问题的范围)。我使用 std::reference_wrapper 的原因是因
我想我彻底搜索了这个网站,但找不到我的问题的答案;我也认为这很简单,但是经过几个小时的困惑之后,我已经放弃并决定寻求帮助...... 这是我的问题;我有一个 DIV,里面有两个 DIV;第一个 DIV
我有一个文本区域字段,其右上角有一个 div 框。我进行了广泛的搜索,但找不到一种方法可以让输入文本区域的文本环绕 div。 #wrapper { position: relative; wi
所以我在使用 FancyBox 时遇到了这个问题,当滚动页面主体(主页)时,框会随机向左和顶部移动位置。 附上 GIF 演示问题: 据我所知,我正在使用 Fancybox v2。 网址是here (在
我的 coinslider 周围有一个容器 div。我想围绕这个容器 div 包装文本。如何实现这一目标? 现在我的 HTML 设置如下: 我的 CSS 是这样设置的: #mycontain
每次我尝试在 CSS 中做一些看似简单的事情时,它都行不通。 我有一个包含 460x160 图像的内容 div。我想做的就是将图片放在右下角,然后用文字环绕它。 text text
我有一个名为“content”的 DIV,其中我有一个图像作为边框/框架,我想绕过它。我都有一个大的整个框架(左、右、上、下),它与它应该的宽度相匹配,而且我把它切碎了,所以我有四个单边框图像(lef
我正在使用 fieldset 在 div 周围创建带标题的边框。 这是代码: Sproc Details:
我是一名优秀的程序员,十分优秀!