2017-03-01 3 views
0

싱글 톤 패턴을 사용하여 클래스의 인스턴스 생성 수를 하나의 객체로 제한 할 수 있다는 인상하에 있습니다. obj3obj4이 같은 객체 증명baseclass-subclass 시나리오의 싱글 톤 패턴

class Singleton(type): 
    _instances = {} 
    def __call__(cls, *args, **kwargs): 
     if cls not in cls._instances: 
      cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 
     return cls._instances[cls] 

class base1(object): 
    __metaclass__ = Singleton 

class base2(base1): 
    pass 

class base3(base1): 
    pass 

class base4(base2): 
    pass   

obj1 = base4() 
obj2 = base4() 

print obj1 is obj2 #prints True 

obj3 = base3() 
obj4 = base3() 

print obj3 is obj4 #prints True 

print obj1 is obj3 #prints False 

먼저 인쇄 문 인쇄 True : 그리고 마음에 유지, 아래의 코드를 살펴 있습니다. 그러나 두 번째 print 문은 False인데 obj1obj3이 동일하지 않음을 보여줍니다. 목표를 달성하기위한 최선의 방법은 무엇입니까? "Always return the same base1 object no matter which sub class instantiates it".

+0

이유도 이러한 서브 클래스를 가질까요? 대칭, 당신이 정말로 싱글 톤을하는 메타 클래스 기반의 시행 경로를 원한다면, 왜 이러한 서브 클래스가 존재하도록 허용합니까? – user2357112

+0

그건 이해가 안돼! 왜 모두가 기본 객체 만 만들 수 있어야만 여러 클래스를 만들 수 있습니까? 기본 클래스의 별칭을 원하십니까? 코드는 계층 구조의 각 ** 클래스에 대해 하나의 싱글 톤 **을 허용하도록 특별히 작성되었습니다. 왜 처음부터 그렇게 프로그래밍 했습니까? – Wombatz

답변

-1

코드는 here에서 복사되었습니다.

당신은 terminal 클래스를 생성하고 상속 할 수없는 __metaclass__ 그래서 다른 클래스로 사용할 수 있습니다 :

class terminal(type): 
    def __init__(self, cl_name, bases, namespace): 
     for cls in bases: 
      if isinstance(cls, terminal): 
       raise TypeError("in "+cl_name+" definition : "+str(cls)+ 
           " can't be used as a base class") 
     super(terminal, self).__init__(cl_name, bases, namespace) 


# first we create a normal class 
class a(object): 
    pass 

#the terminal class: it can inherit from other classes but can't be 
#used as base class 
class b(a): 
    __metaclass__= terminal 

#this will fail because inheriting from b is forbidden 
class c(b): 
    pass 
+0

정확한 "컴파일"시간은 언제입니까? 클래스 생성은 런타임에 발생합니다! – Wombatz

+0

@Wombatz 코드 주석 - 고정. 그 이외에, 당신은 그것이 왜 좋은 대답이 아니라고 생각하는지 설명 할 수 있습니까? – alfasin