2

从以前的 java 经验中,我知道如果两个 GUI 类对象包含彼此的成员变量引用,则可能存在内存泄漏,直到两个对象都被销毁。

这种情况调试起来非常混乱,所以我想使用严格的指导方针来避免现在在 python 中的内存泄漏。

我目前有一个 GUI 系统,其中有一个主窗口(parent_window)和许多子窗口(子窗口),弹出用户的辅助选项等。

我认为防止内存泄漏的一种简单方法是不要在所有子窗口中保留父窗口的类成员变量。

class child_window(object):
    def make_child_window(self, parent_window):
        def on_ok(): parent_window.show()
        QtCore.QObject.connect(self.okbutton, QtCore.SIGNAL("clicked()"), on_ok)

如您所见,我有一个调用 parent_window 的嵌套函数,该函数仅包含在类方法的本地范围内(“make_child_window”)。这是作弊吗?在较低级别上,python 本质上是否将我的“parent_window”存储为类变量?对于将 child_window 与内存中的 parent_window 隔离开来,您还有哪些其他建议?

4

2 回答 2

1

您可以调用 parent,因为它是自己的/派生的方法

class child_window(object):
    def make_child_window(self): # no need for parent
        def on_ok(): self.show() #no need for parent
        QtCore.QObject.connect(self.okbutton, QtCore.SIGNAL("clicked()"), on_ok)

这是有效的,因为 self 实例是方法的字典,并且包含所有派生类的所有方法,因此您可以从任何范围访问它们。

这也回答了您关于 GC 的第一个问题,即只有一个引用,孩子的自我也是父母的自我,派生类也一样。

更深入。您可以从 child 调用parent_object.show(self)具有参数的show(self)静态方法,self以明确告诉从哪个类中使用 instance 上的方法self

self只是实例

于 2012-08-07T19:57:56.897 回答
0

我发现弱引用是一个很好的解决方案。

这意味着“父”GUI 窗口包含对后续“子”GUI 窗口的强引用,并且必要时,每个子窗口都包含对父窗口的弱引用。

然后,当父级从内存中删除时,子级也将被删除,因为不存在循环引用。

于 2013-01-16T18:00:30.463 回答