【问题标题】:How/when to close a file in an object?如何/何时关闭对象中的文件?
【发布时间】:2016-07-23 06:00:10
【问题描述】:

我正在尝试设计一个类来管理 Linux 中的视频设备 (/dev/video*)。

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

后来我了解到python不保证何时/是否调用析构函数。

然后我想我可以制作自己的“初始化”和“取消初始化”方法来管理设备文件的打开/关闭,但是当对象被构造但未初始化以及当对象被反初始化但没有被破坏,此时对象没有有效的内部状态(方法大多是ioctls在打开的视频设备上)。

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    Python 提供了with statement 以允许在构造/破坏之外设置和拆卸对象。您的对象必须包含__enter____exit__ 方法; __enter__with 语句的开头调用,__exit__with 中包含的代码块的结尾调用。值得注意的是 __exit__ 被调用,无论块运行到完成还是提前终止并出现异常。

    显然with 仅在您当时使用该对象时才有用,而不是在您将其作为成员存储在另一个对象中时。但是你可以更深入一层,在 那个 对象周围使用with,并让它的__exit__ 函数在你自己的对象上调用一个清理函数。

    【讨论】:

    • 如果我理解正确,使用 with 语句将对象绑定到有限范围,并且对该对象的所有引用都应该存在于小于该范围的范围内(或者程序格式错误)。这有助于消除第二种危险时间间隔的可能性(即,“如果对象被拆除但有人仍然持有它的引用怎么办?”)因为在范围结束后,没有人应该持有对它的引用。同时在构造函数中打开文件消除了第一种时间间隔。两种方法结合解决问题?
    • 不,with 语句不会阻止其他用户保留对您对象的引用。如果对象上的某些操作在关闭后无效,您可能应该在这些情况下引发异常(您可能希望在对象上具有closed 属性以便于测试)。与with 语句兼容只会让您的用户在完成文件后轻松自动关闭文件(如果出现问题,也不要让它保持打开状态)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多