我正在尝试设计一个类来管理Linux中的视频设备(/dev/video*
)。
由于我的C ++背景,我自然以为我可以在构造函数中打开文件并在析构函数中关闭它。
后来我学会了python并不能保证何时/如果调用析构函数。
然后我想我可以创建自己的“初始化”和“去初始化”方法来管理设备文件的打开/关闭,但是当构造了对象但未初始化时,它会创建时间间隔。对象被去初始化但没有被破坏,此时对象没有有效的内部状态(这些方法在打开的视频设备上大多是ioctls
)。
这意味着我需要在每个方法的开头验证对象状态,比如内置文件对象(f=open()
,f.close
)?或者只是在已经去初始化的对象上调用方法时发生I / O错误?
答案 0 :(得分:0)
继续在构造函数中打开文件,它不会伤害任何东西。
Python提供了with
statement,允许在构造/销毁之外设置和拆除对象。您的对象必须包含__enter__
和__exit__
方法;在__enter__
语句的开头调用with
,并在__exit__
中包含的代码块结束时调用with
。值得注意的是,__exit__
被调用,无论块是运行完成还是因例外而提前终止。
显然with
只有在您当时正在使用该对象时才有用,而不是在您将其作为成员存储在另一个对象中时。但是你可以更深入地使用with
围绕那个对象,并使其__exit__
函数在你自己的对象上调用一个清理函数。