0

PlotHandlerクラスのインスタンスをたくさん作成しました。インスタンスは、変数をプライベートに保つ必要があります。しかし、私がそれらを管理した方法は、問題を検出するのが難しいことにつながりました。プライベートリスト変数はインスタンス間で共有されます!そして、それもリークの明らかな原因がありません。

私のデバッグでは、リストを変更するプライベートメンバー関数は、オブジェクトが異なっていても同じリストを参照することがわかりました。

これは「落とし穴」の問題ですか?これをトラブルシューティングするための最良の方法は何ですか?


これが実装の関連部分です(私はそれらがそうであることを願っています!)。ALL-CAPSのコメントをご覧ください。

PlotHandlerを実装するファイル:

class PlotHandler(wx.Frame):
    __crop_section = None
    __projection   = None
    __crop_xcord   = None

    _band_data     = [] #THIS GETS SHARED

def _on_plot_click(self, xcord): #CALLED BY ANOTHER OBJECT
    band = self._analyze_band( xcord )
    self._band_data.append(band)
    ...

PlotHandlersを管理している親クラス:

class MainFrame(wx.Frame):
    __close_callback__ = None
    _plot_handlers     = []
    def __init__(self, parent, title):
        ...


    def InitUI(self):
        ...

        img_handler = ImageHandler(panel)
        self.img_src.register_callback( img_handler.update_image )

        #you need to call PlotHandler(parent, cropped)
        img_handler.register_sample_callback( self._create_new_plot_handler )

        ...

    def _create_new_plot_handler(self, cropped_sample ):
    self._plot_handlers.append( PlotHandler(self, cropped_sample) ) #CREATE THEM
4

2 に答える 2

3

this questionthis one、および「共有されたPythonクラス変数」、「Python FAQクラス変数」などをグーグルで見つけることができる他の多くのものを参照してください。

簡単に言えば、クラス本体で直接定義された変数はインスタンス変数ではなくクラス変数であるため、クラスのインスタンス間で共有されます。インスタンス変数が必要な場合は、にアクセスできるメソッド内から変数を割り当てる必要がありますself

于 2012-06-15T06:39:07.447 に答える
1

クラス属性はインスタンス間で共有されます。インスタンス属性を定義する場合 (各オブジェクトが変数への独自の参照を持つようにするため)、次のように定義する必要があります。__init__

class PlotHandler(wx.Frame):
    __crop_section = None
    __projection   = None
    __crop_xcord   = None

    def __init__(self, **kwargs):
        self._band_data = [] #THIS IS NOT SHARED
于 2012-06-15T06:39:22.900 に答える