实例对象之间无意中共享了私有列表变量

时间:2012-06-15 06:35:04

标签: python

我创建了许多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

2 个答案:

答案 0 :(得分:3)

请参阅this questionthis one,以及通过Google搜索“Python类变量共享”,“Python常见问题类变量”等找到的大量其他内容。

简短的回答是:直接在类体中定义的变量是类变量,而不是实例变量,因此在类的实例之间共享。如果您想要实例变量,则必须在方法中分配它们,您可以访问self

答案 1 :(得分: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