我想使用对象的
__del__
方法根据某些条件自动将对象数据写入外部数据库或本地缓存(全局字典)。上下文管理器不适合我。
但是,这意味着,一旦调用
__del__
(因为该对象已超出范围),可能会在本地缓存中创建对该对象的新引用。因为这听起来像是潜在的麻烦,所以我写了一个简单的简短测试用例:
cache = []
class Temp:
def __init__(self) -> None:
self.cache = True
def __del__(self) -> None:
print('Running del')
if self.cache:
cache.append(self)
def main():
temp = Temp()
print(temp.cache)
main()
if cache:
print(cache[0].cache)
当我运行它时,它输出:
True
Running del
True
正如我所料
True
Running del
True
Running del
即
__del__
调用了两次,一次是在 main
末尾超出范围时调用,一次是在程序结束时调用,因为新的引用存储在缓存中。为什么__del__
不运行两次?