我有一个类,我在构造函数中创建一个文件对象。这个类还实现了finish()方法作为其接口的一部分,在这个方法中我关闭了文件对象。问题是,如果我在此之前得到异常,则不会关闭该文件。有问题的类有许多其他使用文件对象的方法。我是否需要将所有这些包装在 try finally 子句中,还是有更好的方法?
谢谢,
百里
答案 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
语句中使用的上下文管理器。