2016-07-22 57 views
1

我试图设计一个类来管理Linux中的视频设备(/dev/video*)。如何/何时关闭对象中的文件?

由于我的C++背景,我自然以为我可以在构造函数中打开该文件并在析构函数中关闭它。

然后后来我知道python不保证何时/如果析构函数被调用。

然后我认为我可以使自己的“初始化”和“去初始化”方法来管理设备文件的打开/关闭,但是当对象被构造但未初始化时会创建时间间隔,该对象被初始化但未被破坏,此时对象没有有效的内部状态(在打开的视频设备上方法大多为ioctls)。

这意味着我需要验证每个方法开始时的对象状态,如内置文件对象(f=open(),f.close)?或者只是在已经被初始化的对象上调用一个方法时发生I/O错误?

回答

0

继续,并在构造函数中打开文件,它不会伤害任何东西。

Python提供with statement以允许建立和拆除超出构造/销毁的对象。您的对象必须包含__enter____exit__方法;在with语句的开头调用__enter__,在with中包含的代码块结束时调用__exit__。值得注意的是__exit__被调用,无论该块运行完成还是提前终止并出现异常。

显然,with只有当你在那里使用对象时才有用,例如,如果你将它作为成员存储在另一个对象中,则不是有用的。但是你可以更深入一层,并且使用with对象,并且它的__exit__函数调用你自己的对象的清理函数。

+0

如果我理解正确,使用'with'语句将对象绑定到一个有限的范围内,并且该对象的所有引用都应该位于小于该范围的范围内(或者该程序不合格)。这有助于消除第二种危险时间间隔的可能性(即“如果对象被拆除但有人仍然参照它?”),因为在范围结束之后,没有人想要引用它。同时在构造函数中打开文件消除了第一种时间差距。两种方法结合解决了这个问题? – user3528438

+0

不,“with”语句不会阻止其他用户保留对您的对象的引用。如果对象上的某些操作在关闭后无效,则可能应该在这些情况下引发异常(您可能希望在对象上具有“闭合”属性以使其易于测试)。与'with'语句兼容使用户可以在完成后自动关闭文件(并且在发生错误时不会打开它)。 – Blckknght