Python 如何/何时关闭对象中的文件?
我正在尝试设计一个类来管理Linux中的视频设备(Python 如何/何时关闭对象中的文件?,python,Python,我正在尝试设计一个类来管理Linux中的视频设备(/dev/video*) 因为我的C++背景,我自然认为我可以在构造函数中打开文件并在析构函数中关闭它。 后来我了解到python不能保证何时/是否调用析构函数 然后我想我可以创建自己的“初始化”和“反初始化”方法来管理设备文件的打开/关闭,但是当构造对象但未初始化时,以及当对象反初始化但未销毁时,它会创建时间间隔,此时对象没有有效的内部状态(这些方法大多是在打开的视频设备上的ioctls) 这意味着我需要在每个方法开始时验证对象状态,比如内置的
/dev/video*
)
因为我的C++背景,我自然认为我可以在构造函数中打开文件并在析构函数中关闭它。
后来我了解到python不能保证何时/是否调用析构函数
然后我想我可以创建自己的“初始化”和“反初始化”方法来管理设备文件的打开/关闭,但是当构造对象但未初始化时,以及当对象反初始化但未销毁时,它会创建时间间隔,此时对象没有有效的内部状态(这些方法大多是在打开的视频设备上的ioctls
)
这意味着我需要在每个方法开始时验证对象状态,比如内置的文件对象(
f=open()
,f.close
),或者在对已取消初始化的对象调用方法时让I/O错误发生?继续,在构造函数中打开文件,这不会造成任何伤害
Python提供了允许在构建/销毁之外设置和拆卸对象的方法。您的对象必须包含\uuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法;\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu在带有
的中调用d。值得注意的是,无论块运行到完成状态还是在异常情况下提前终止,都会调用\uuuuuuuuuuuuuu
显然,with
仅当您当时正在使用对象时才有用,例如,如果您将其作为成员存储在另一个对象中,则不可用。但您可以更深入一层,在该对象周围使用with
,并使其退出
函数在您自己的对象上调用清理函数。去吧ead并在构造函数中打开文件,这不会造成任何伤害
Python提供了允许在构建/销毁之外设置和拆卸对象的方法。您的对象必须包含\uuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法;\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu在带有
的中调用d。值得注意的是,无论块运行到完成状态还是在异常情况下提前终止,都会调用\uuuuuuuuuuuuuu
显然,with
仅当您当时正在使用对象时才有用,例如,如果您将其作为成员存储在另一个对象中,则不可用。但您可以更深入一层,在该对象周围使用with
,并使其退出
函数在您自己的对象上调用清理函数。如果我找到它正确理解,使用with
语句将对象绑定到有限范围内,并且对该对象的所有引用都应该位于小于该范围的范围内(或者程序格式不正确)。这有助于消除第二种危险时间间隔的可能性(即,“如果该对象已被拆下,但仍有人引用该对象,该怎么办?”)因为在作用域结束后,没有人会持有对它的引用。同时,在构造函数中打开文件可以消除第一种时间间隔。两种方法结合使用可以解决问题?不,一个with
语句不会阻止其他用户保留对你的对象的引用。如果对你的对象的某些操作是invalid关闭后,您可能应该在这些情况下引发一个异常(您可能希望对象上有一个closed
属性,以便于测试)。与with
语句兼容只会让用户在完成文件后更容易自动关闭文件如果我理解正确,使用with
语句将对象绑定到一个有限范围内,并且对该对象的所有引用都应该位于一个小于该范围的范围内(或者程序格式不正确)。这有助于消除第二种危险时间间隔的可能性(也就是说,“如果对象被拆下,但仍有人引用它怎么办?”)因为在作用域结束后,没有人会持有对它的引用。同时,在构造函数中打开文件可以消除第一种时间间隔。两种方法结合使用可以解决问题?不,一个with
语句不会阻止其他用户保留对你的对象的引用。如果对你的对象的某些操作是invalid关闭后,您可能应该在这些情况下引发一个异常(您可能希望对象上有一个closed
属性,以便于测试)。与with
语句兼容只会让用户在完成文件后更容易自动关闭文件(如果出现问题,不要让它打开)。