2

Java での以前の経験から、2 つの GUI クラス オブジェクトに互いのメンバ変数参照が含まれている場合、両方のオブジェクトが破棄されるまでメモリ リークが発生する可能性があることを認識しています。

その状況はデバッグが非常に面倒だったので、現在 Python でメモリ リークを回避するための厳密なガイドラインを使用したいと考えています。

私は現在、メイン ウィンドウ (parent_window) と、ユーザーの補助オプションを含む多くのサブ ウィンドウ (子ウィンドウ) がある GUI システムを持っています。

メモリリークを防ぐ簡単な方法は、すべての子ウィンドウで親ウィンドウのクラスメンバー変数を保持しないことだと思いました。

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)

ご覧のとおり、クラス メソッド ("make_child_window") のローカル スコープにのみ含まれるparent_window を呼び出すネストされた関数があります。これは不正行為ですか?下位レベルでは、python は基本的に「parent_window」をクラス変数として保存しますか? child_window をメモリ内のparent_window に保持することから分離するための他の推奨事項は何ですか?

4

2 に答える 2

1

独自/派生メソッドであるため、親を呼び出すことができます

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)

これは、自己インスタンスがメソッドの辞書であり、すべての派生クラスのすべてのメソッドが含まれているため、どのスコープからでもアクセスできるため機能します。

これは、GC に関する最初の質問にも答えます。参照は 1 つしかなく、子の自己は親の自己でもあり、派生クラスも同じです。

さらにもっと。childから、インスタンスでどのクラスからメソッドを使用するかを明示的に伝えるパラメータを持つ静的メソッドとparent_object.show(self)同じように呼び出すことができます。show(self)selfself

self単なるインスタンスです

于 2012-08-07T19:57:56.897 に答える
0

弱い参照が優れたソリューションであることがわかりました。

これは、「親」GUI ウィンドウが後続の「子」GUI ウィンドウの強い参照を含み、必要に応じて、各子が親の弱い参照を含むことを意味します。

次に、親がメモリから削除されると、循環参照が存在しないため、子も削除されます。

于 2013-01-16T18:00:30.463 に答える