2012-11-29 3 views
-1

여기 wxPython 클래스를 서브 클래 싱하고 singleton이라는 클래스 메서드를 정의합니다.서브 클래 싱 가능한 싱글 톤은 어떻게 구현합니까?

class AddressCellAttr(wx.grid.GridCellAttr): 
    _instance = None 

    def __init__(self): 
     wx.grid.GridCellAttr.__init__(self) 

     self.SetTextColour('#0000FF') 

    @classmethod 
    def singleton(cls): 
     if cls._instance == None: 
      cls._instance = cls() 

     return cls._instance 

class ValidAddressCellAttr(AddressCellAttr): 
    def __init__(self): 
     AddressCellAttr.__init__(self) 

     self.SetTextColour('#00FF00') 

class CorrectedAddressCellAttr(AddressCellAttr): 
    def __init__(self): 
     AddressCellAttr.__init__(self) 

     self.SetTextColour('#FFFF00') 

class InvalidAddressCellAttr(AddressCellAttr): 
    def __init__(self): 
     AddressCellAttr.__init__(self) 

     self.SetTextColour('#FF0000') 

class UnparsableAddressCellAttr(AddressCellAttr): 
    def __init__(self): 
     AddressCellAttr.__init__(self) 

     self.SetTextColour('#555555') 

나머지 클래스는 첫 번째 하위 클래스의 하위 클래스입니다. 싱글 톤 클래스 메소드는 클래스에서 작동하기 때문에 모든 서브 클래스에서도 작동 할 것이라고 생각했습니다. 서브 클래스는 사실 별도의 클래스입니다.

AddressCellAttr에서 singleton을 한 번 호출하면 싱글 톤 메서드는 모든 하위 클래스에서도 동일한 개체를 반환합니다. 왜 이런 일이 생길까요?

+0

-1 싱글 톤의 뻔뻔스럽고 불건전 한 남용과 세상에이 괴물을 괴롭히는 데 도움이되도록하기 위해. – cHao

+0

@cHao : sr2222의 답변에 대한 최신 의견을 읽으십시오. 단점을 사용하는 것보다 내 문제를 해결하는 더 좋은 방법을 설명 할 수없는 경우 제외 투표를 제거하십시오. – Hubro

답변

0

당신이 여기에 싱글 톤 패턴이 필요하지만, 어떤 경우에, 당신이 정말로 __new__에서이 일을해야한다고 생각하는 이유 확실하지.

class Singleton(object): 

    def __new__(cls): 

     try: 
      return cls._instance 
     except AttributeError: 
      cls._instance = object.__new__(cls) 
      return cls._instance 

그냥 모든 서브 클래스는 부모 __new__() 전화를 확인하고 __new__()__init__()의 서명이 일치해야한다는 것을 기억하십시오.

+0

싱글 톤 패턴을 사용하고 있습니다. 왜냐하면이 클래스 중 하나를 두 번 이상 인스턴스화해야 할 필요가 없기 때문입니다. 왜 다른 사람은 싱글 톤 패턴을 사용해야합니까? – Hubro

+0

@Codemonkey : 싱글 톤 패턴을 사용하는 유일한 타당한 이유는 클래스 *를 두 번 이상 인스턴스화 할 수없는 경우입니다. 예를 들어 다른 인스턴스를 만들면 웜홀이 열리고 컴퓨터가 작동하지 않을 수 있습니다. 만약 당신이 * 단지 * 하나의 인스턴스를 원한다면, 더 간단한 수정이 있습니다 - ** 생성하지 않고 * 하나만 만듭니다 ** 모든 것을 싱글 톤으로 만들고 이제는 제약을 적용하는 코드를 추가하고 있습니다 존재하지 않아야합니다 ... 말할 것도없고 클래스의 특정 클래스를 하드 코딩하여 미래의 변화를 악몽으로 만듭니다. – cHao

+0

@cHao : 소리가 나는 것처럼 간단하지가 않습니다. 클래스를 싱글 톤으로 정의하는 것은 내 상황에서 단일 인스턴스를 유지하는 것보다 훨씬 쉽습니다. 클래스는 내 코드에 * 많은 *을 사용하고이 인스턴스에 대해 내가 그냥 싱글로 구현하는 데 걸리는보다 그것들을 사용할 필요가 때마다 전역을 확인하는 나를 위해 훨씬 더 많은 코드를합니다. 게다가 wxPython은'wx.App.OnInit' 이후까지'wx.grid.GridCellAttr' 객체를 생성 할 수 없기 때문에 모듈 상단의 각 클래스 중 하나를 인스턴스화 할 수 없습니다. 다른 모듈) – Hubro

0

좋아요, 질문을 쓰는 동안 나 자신을 알아 냈습니다. 싱글 톤 메서드가 호출되면 실제로 올바른 서브 클래스가 매개 변수로 전달되지만 서브 클래스는 _instance을 정의하지 않으므로 cls._instanceAddressCellAttr 및 원래 _instance으로 클래스 체인을 찾습니다.

용액 특별히 같이 각 서브 클래스에 대한 _instance를 정의한다 : 등

class ValidAddressCellAttr(AddressCellAttr): 
    _instance = None 

    def __init__(self): 
     AddressCellAttr.__init__(self) 

     self.SetTextColour('#00FF00') 

그리고.