0

PlotHandler我创建了一个类的许多实例。一个实例必须保持它的变量私有。但是我管理它们的方式导致了一个难以检测的问题,一个私有列表变量在实例之间共享!而且这也没有任何明显的泄漏来源。

我的调试告诉我,修改列表的私有成员函数看到的是同一个列表,即使它们是不同的对象。

这是一个“陷阱”问题吗?解决此问题的最佳方法是什么?


这是实现的相关部分(我希望它们是!)。请参阅全大写评论:

实现 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

通过谷歌搜索“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 回答