ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 싱글턴 패턴
    Python/이것저것 파이썬 2021. 10. 23. 13:31
    반응형

    인스턴스가 하나만 생성되어야 할 때 사용하는 패턴.

     

    간단히

    class Singleton(type):
        __instance = None
    
        def __call__(cls, *args, **kwargs):
            if cls.__instance is None:
                cls.__instance = super().__call__(*args, **kwargs)
            return cls.__instance
    
    
    class MyClass(metaclass=Singleton):
    
        def __init__(self, x):
            self.x = x
    
    
    m1 = MyClass(1)
    m2 = MyClass(2)
    print(m1, m2)
    assert m1 is m2
    print(m1.x, m2.x)
    assert m1.x == m2.x
    # print(m1, m2)
    <__main__.MyClass object at 0x0000021CDEDF7E80> <__main__.MyClass object at 0x0000021CDEDF7E80>
    # print(m1.x, m2.x)
    1 1

    MyClass object의 주소(0x0000021CDEDF7E80, 실행 상황에 따라 바뀜)가 같다. 

    m2.x가 2가 아닌 1이다. (주의)

    Python의 type은 자료형을 확인하는 것뿐만 아니라 동적으로 클래스를 생성하는 데에도 사용된다. 

    메타클래스도 사용되었다.

    메타의 뜻은 여기를 참고. 

    메타클래스에 대한 설명은 여기를 참고.
    (예제가 정확히 작동하진 않는다.)

     

    이렇게도 작성할 수 있다. 

    class Singleton(type):
    
        def __init__(cls, name, bases, attrs, **kwargs):
            super().__init__(name, bases, attrs)
            cls._instance = None
    
        def __call__(cls, *args, **kwargs):
            if cls._instance is None:
                cls._instance = super().__call__(*args, **kwargs)
            return cls._instance
    
    
    class MyClass(metaclass=Singleton):
    
        def __init__(self, x):
            self.x = x
    
    
    m1 = MyClass(1)
    m2 = MyClass(2)
    print(m1, m2)
    print(m1.x, m2.x)
    assert m1 is m2
    assert m1.x == m2.x

     

    반응형
Designed by Tistory.