保证文件关闭

时间:2011-10-25 12:00:46

标签: python

我有一个类,我在构造函数中创建一个文件对象。这个类还实现了finish()方法作为其接口的一部分,在这个方法中我关闭了文件对象。问题是,如果我在此之前得到异常,则不会关闭该文件。有问题的类有许多其他使用文件对象的方法。我是否需要将所有这些包装在 try finally 子句中,还是有更好的方法?

谢谢,

百里

3 个答案:

答案 0 :(得分:11)

您可以使您的类成为上下文管理器,然后在with语句中包装对象的创建和使用。有关详细信息,请参阅PEP 343

要使您的类成为上下文管理器,必须实现方法__enter__()__exit__()。输入__enter__() - 语句时会调用with,无论如何都保证在您离开时__exit__()被调用。

然后您可以像这样使用您的课程:

with MyClass() as foo:
    # use foo here

如果您在构造函数中获取资源,则可以__enter__()只返回self而无需执行任何操作。 __exit__()只需拨打finish() - 方法。

答案 1 :(得分:3)

对于短期文件对象,建议使用try / finally对或更简洁的with-statement作为一种干净的方法,以确保刷新文件并释放相关资源。

对于长寿命文件对象,您可以使用 atexit()注册以进行显式关闭,或者只需依赖解释器清理即可退出。

在交互式提示下,大多数人都不会为简单的实验而烦恼,因为没有太多的缺点让文件未关闭或依赖引用计数或GC关闭。

关闭文件被视为好方法。但实际上,没有明确关闭文件很少会产生明显的影响。

答案 2 :(得分:1)

您可以拥有try ... finally对,也可以将您的类设置为适合在with语句中使用的上下文管理器。