在 Python 中正确完成

Proper finalization in Python

我有一堆实例,每个实例都有一个唯一的临时文件供其使用(将数据从内存保存到磁盘并稍后检索)。

我想确保在一天结束时,所有这些文件都被删除。但是,我想为对它们的删除进行细粒度控制留出空间。也就是说,如果需要,可以提前删除一些文件(例如,它们太大而且不再重要)。

实现此目标的最佳/推荐方法是什么?

可能对此有想法

在理想情况下,似乎 __del__atexit 库的组合可能表现最佳。即在__del__atexit注册的方法都进行清理,禁止重复清理。如果调用__del__,注册的将被删除。

唯一(但至关重要)的问题是,如果方法在 atexit 注册,__del__ 不会 运行,因为对该对象的引用永远存在。

因此,欢迎任何建议、建议、有用的 link 等等。

我建议考虑 weakref built-in module for this task, more specifically weakref.finalize 简单的例子:

import weakref
class MyClass:
    pass
def clean_up(*args):
    print('clean_up', args)
my_obj = MyClass()
weakref.finalize(my_obj, clean_up, 'arg1', 'arg2', 'arg3')
del my_obj  # optional

当运行时会输出

clean_up ('arg1', 'arg2', 'arg3')

请注意,即使没有 my_objdel-ing,clean_up 也会执行(您可以删除最后一行代码,行为不会改变)。 clean_up 在对 my_obj 的所有强引用消失或结束后调用(例如使用 atexit 模块)。