首页 > 解决方案 > 可以防止调用“__del__()”的“参考循环”示例?

问题描述

(我正在使用 Python 3.6.5

我正在调试一个似乎是由于__del__没有被调用引起的生产问题。__init_我在两者中都添加了调试消息,__del__结果有时(遇到产品问题时)__del__没有被调用。

我用谷歌搜索了很多,根据我的理解,有两种情况__del__可能不会被调用:

  1. os._exit()
  2. 循环参考(或参考循环)

我很确定我们没有打电话os._exit(),所以我怀疑这个问题很可能是由一些参考循环引起的,但我没有弄清楚参考循环会是什么样子。那么有人可以帮助举一个可以防止被调用的参考循环的例子吗?__del__

标签: pythonpython-3.x

解决方案


似乎评论中提到的PEP 0442 (Python 3.4) 不适用于所有场景。刚刚从这里找到了一个例子(用 Python 3.5.3测试):

[STEP 101] # cat ref_loop.py
class Foo():
    def __init__(self):
        print("now in __init__")
        self.foo = self

    def __del__(self):
        print("now in __del__")

foo = Foo()
exit()
[STEP 102] # python3 ref_loop.py
now in __init__
[STEP 103] # python3 --version
Python 3.5.3
[STEP 104] #

我的另一个 Python 3.6.5也可以重现它。

请注意,如果exit()删除了 then__del__()将被调用,尽管我不明白为什么。


推荐阅读