我有一个类,在构造函数中创建了一个文件对象。该类还实现了一个finish()方法作为其接口的一部分,在此方法中关闭文件对象。问题是,如果在这一点之前出现异常,则文件将不会被关闭。该类有许多其他使用文件对象的方法。我需要将所有这些方法都包装在try finally子句中吗?还是有更好的方法?
谢谢,
Barry
谢谢,
Barry
with
语句中包装对象的创建和使用。详情请参见PEP 343。__enter__()
和 __exit__()
。 当进入 with
语句时调用__enter__()
,并且无论如何离开时都保证调用__exit__()
。with MyClass() as foo:
# use foo here
如果您在构造函数中获取资源,则可以使__enter__()
方法简单地返回self
而不执行任何操作。__exit__()
方法应该只调用您的finish()
方法。
close
实例方法中调用 file_handle.close()
并使用 contextlib.closing
。(已删除 do
) - agfcontextlib
。我并不打算针对这个具体例子建议使用contextlib.contextmanager
,我只是认为提及它会很有用,因为有些情况下其他方法并不那么干净利落。 - user395760你可以使用 try
...finally
语句块,或将你的类设计为适用于 with
语句的上下文管理器。