我有一个PyQt的QWidget(对象A;它只是一个被动容器),其中包含几个子部件(即有Qt样式的父子引用)。A的子部件由另一个对象(对象B;不一定是Qt对象)引用,该对象向A的子部件提供数据并实际控制A的子部件的创建和结构。除了A的子部件外,对象B没有其他外部引用。对象A对对象B有一个引用。因此,这是循环引用的纯教科书例子。
在某个时间点上,我想删除对象A和B的整个相互连接的结构。我只需调用
出于调试目的,我想使用
因此,基本上有两个问题:
1.使用
在某个时间点上,我想删除对象A和B的整个相互连接的结构。我只需调用
A.deleteLater()
(这是推荐使用的Qt对象方法)。我觉得它能够正常工作并删除A和B,因为它们没有外部引用,只有相互引用......但问题是,我不是很确定它是否真正起作用,是否可以依靠它在任何地方工作以及是否存在风险,例如如果有人将B子类化。出于调试目的,我想使用
__del__
析构函数来观察A和B的正确销毁,它将打印类似于A was destroyed
的内容。但是我从文档中了解到,当存在__del__
时,垃圾回收器不会回收具有循环引用的对象。这是不是意味着观察销毁将影响或取消销毁? 如果我没错,这似乎就像量子力学 - 存在观察者会影响实验结果。因此,基本上有两个问题:
1.使用
deleteLater()
方法是否正确和可靠?
2.__del__
析构函数中的消息打印是否会影响垃圾回收器?或者我可以使用什么其他方式来观察和确认调试期间的销毁?
__del__
方法时,带有循环引用的对象不会被垃圾回收器收集。但是这对于Python3.4而言已经不再适用,因为实施了PEP442。 - matasomeObject.destroyed
信号来查看销毁是否发生。 - mlvljr