gpt4 book ai didi

python - 使用 __del__ 观察 Python 和 PyQt 中的对象破坏

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:02 24 4
gpt4 key购买 nike

我有一个 PyQt QWidget(对象 A;它只是一个被动容器),其中包含几个子小部件(即有 Qt'ish 父子引用)。 A 的子部件从另一个对象(对象 B;不一定是 Qt 对象)引用,该对象为 A 的子部件提供数据并实际控制 A 的子部件的创建和结构。除了 A 的子对象之外,对象 B 没有其他外部引用。对象 A 引用了对象 B。因此,它是循环引用的纯教科书示例。

我想在某个时间点删除对象 A 和 B 的整个互连结构。我只需调用 A.deleteLater(),这是推荐用于 Qt 对象的方法。在我看来它工作正常并删除 A 和 B 因为它们没有外部引用,只有相互引用......但问题是我不太确定它是否真的有效,是否可以依赖它将在任何地方工作,如果有任何危险,例如如果有人将 B 子类化。

出于调试目的,我想使用 __del__ 析构函数观察 A 和 B 的正确销毁,该析构函数只会打印类似 A was destroyed 的内容。但是后来我在文档中了解到,当存在 __del__ 时,垃圾收集器将不会收集具有循环引用的此类对象。这是否意味着观察破坏会影响或取消破坏?如果我是对的,这似乎类似于量子力学——观察者的存在会影响实验结果。

所以基本上有两个问题:

  1. deleteLater() 的使用是否正确可靠?和

  2. __del__ 析构函数中的消息打印会影响垃圾收集器吗?或者在调试过程中我可以使用哪些其他方式来观察和确认销毁?

最佳答案

一种可能的方法是使用 weak reference到对象,然后定期检查它是否已被垃圾收集(或强制垃圾收集)。这是一个简单的例子:

>>> import weakref
>>> class Object:
... pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> r()
<__main__.Object instance at 0x10e8c9e18>
>>> del o
>>> r()
<__main__.Object instance at 0x10e8c9e18>
>>> import gc
>>> gc.collect()
0
>>> r()
>>>

关于python - 使用 __del__ 观察 Python 和 PyQt 中的对象破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20704887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com