2012-06-15 3 views
0

PlotHandler 클래스의 인스턴스가 여러 개 생성되었습니다. 인스턴스는 변수를 비공개로 유지해야합니다. 하지만 내가 관리하는 방식으로 문제를 발견하기가 어려웠습니다 개인 목록 변수가 인스턴스간에 공유되었습니다! 그리고 그것도 누출에 대한 명백한 출처가없는 것입니다.개인 목록 변수가 실수로 인스턴스 개체간에 공유됩니다.

내 디버깅은 목록을 수정하는 개인 멤버 함수가 서로 다른 개체 인 경우에도 같은 목록을 볼 수 있다고 말했습니다.

이 문제가 "문제"입니까? 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?


여기 구현의 관련 부분이 있습니다! 올 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

에서 그것을 정의해야합니다 (각각의 객체가 변수에 대한 자신의 참조가)'_band_data'는이 인스턴스간에 공유되는 것이 정상입니다, 클래스 속성입니다. –

+0

정상적인 동작입니까? 정교하게 써 주시겠습니까? – aitchnyu

+0

이니셜 라이저로 이동하면 문제가 해결됩니다. –

답변

3

this question, this one를 참조하십시오, 및 기타 물건의 톤을 당신은 "파이썬 클래스 변수 공유", "파이썬 FAQ 클래스 변수"등으로 검색 할 수 있습니다.

짧은 대답은 : 클래스 본문에 직접 정의 된 변수는 인스턴스 변수가 아닌 클래스 변수이므로 클래스의 인스턴스간에 공유됩니다. 인스턴스 변수를 원할 경우 self에 액세스 할 수있는 메서드 내에서 인스턴스 변수를 지정해야합니다.

+1

이것은 가장 명확한 설명입니다 : http://stackoverflow.com/questions/8860447/why-does-python-seem-to-treat-instance-variables-as-shared-between-objects. – aitchnyu

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 
관련 문제