我创建了许多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
答案 0 :(得分:3)
请参阅this question,this 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