观察Python和PyQt中的对象破坏__

2024-06-25 23:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pyqtqwidget(objecta;它只是一个pasive容器),它包含几个子小部件(即,有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__析构函数中打印消息是否会影响垃圾回收器?或者在调试过程中,我还能用什么方法来观察和确认破坏?


Tags: 对象函数部件qt结构容器垃圾提供数据
1条回答
网友
1楼 · 发布于 2024-06-25 23:54:01

一种可能的方法是对对象使用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()
>>>

相关问题 更多 >