我正在使用PyOpenGL编写中等复杂的Python程序。 OpenGL编程需要获取大量资源,我想知道如何管理它们的发布。
据我了解,例如在C ++中,一种常见的策略是拥有包装资源的类,这些类在资源的构造函数中获取资源,并在其析构函数RAII惯用语中释放资源。 RAII在Python中的效果不佳,因为析构函数(实际上是终结器)并未确定地调用,例如here。
如此处指出的那样,Python中用于管理资源的主要工具是with
语句和上下文管理器。我不明白的是它如何扩展到大中型程序,其中使用资源的代码不是单一的语句集。 with
语句可以替换持有对象引用超出范围的局部变量的C ++机制,但不能替换持有对象引用被破坏时持有对象引用“过期”的对象字段的C ++机制。>
对于一个简单的示例,假设我有一个类,在实例化时会打开一个文件进行写入,例如用于记录。该文件在对象(功能)存在的整个过程中保持打开状态,并以不同的方法写入。由于写在不同方法上,因此with
语句不适用。那么,当不再使用该对象时,如何确保关闭文件?
我是否使类本身成为上下文管理器(实现__enter__
和__exit__
),并保证仅通过with
语句使用实例?
还是我将每个__init__
方法与close
方法配对,并发誓在不再需要该对象时总是调用此方法?
Pythonic 的方式是什么?
如果这个问题不是特别清楚,我深表歉意。那是因为我想把我的想法笼罩在我不清楚的地方。我希望对如何使其更加清晰有任何评论。
个人背景:我不是C ++程序员,总体上没有做过很多OOP,但是我认为我对OOP的了解可能是由我对C ++的了解所决定的。