나는 이렇게 본다/파이썬 디자인 패턴

싱글톤 패턴, 게으른 초기화, 모듈 싱글톤

daco2020 2022. 5. 24. 20:05
반응형

싱글톤 패턴

  • 글로벌하게 접근 가능한 단 한 개의 객체만을 허용하는 패턴
  • 주로 로깅이나 디비, 프린터 스풀러 등 동일한 리소스에 대한 동시 요청의 충돌을 막기 위해 사용
  • 목적
    • 클래스에 대한 단일 객체 생성
    • 전역 객체 제공
    • 공유된 리소스에 대한 동시 접근 제어
  • 구현 코드
class Singleton(object):
    # __new__를 오버라이드 한다.
    def __new__(cls):
        # hasattr는 객체가 instance 속성을 가지고 있는지 확인한다. (객체의 존재 유무 확인)
        if not hasattr(cls, 'instance'):
            # 클래스 객체가 없다면 객체를 할당한다.
            cls.instance = super(Singleton, cls).__new__(cls)
        # 기존 또는 할당한 객체를 반환한다.
        return cls.instance

obj = Singleton()
print("created", obj)

other_obj = Singleton()
print("created", other_obj)

"""
결과값 - 동일한 객체가 호출된다.
created <__main__.Singleton object at 0x101033640>
created <__main__.Singleton object at 0x101033640>
"""

 

 

게으른 초기화 (Lazy instantiation)

  • 모듈을 임포트 할 때 아직 필요하지 않은 시점에 실수로 객체를 미리 생성하는 경우가 있다.
  • 게으른 초기는 리소스가 제한적일 때 객체가 꼭 필요한 시점에 생성하는 방식이다.
  • 구현 코드
class Singleton:
    __instance = None
    def __init__(self):
        # 인스턴스가 생성되지 않을 때 메시지
        if not Singleton.__instance:
            print("__init__ method called...")
        # 인스턴스가 생성되었을 때 메시지
        else:
            print("Instance already created:", self.getInstance())

    @classmethod
    def getInstance(cls):
        # 인스턴스가 없다면 인스턴스를 생성하는 메서드
        if not cls.__instance:
            cls.__instance = Singleton()
        return cls.__instance



obj = Singleton() # 인스턴스를 생성하지 않음
# __init__ method called...

print(f"{obj=}") 
# obj=<__main__.Singleton object at 0x100ca7610>

print("created", Singleton.getInstance()) # 인스턴스 생성
# __init__ method called...
# created <__main__.Singleton object at 0x100ca75e0>

other_obj = Singleton() # 인스턴스가 이미 생성되었음
# Instance already created: <__main__.Singleton object at 0x100ca75e0'

print(f"{other_obj=}") # 기존 인스턴스와 동일함
# other_obj=<__main__.Singleton object at 0x100ca75b0>

여기서 한 가지 의문은 메서드로 인스턴스를 생성하기 전, `print(f"{obj=}")` 에서 이미 객체 식별자가 존재한다는 점이다.

 

 

모듈 싱글톤

  • 파이썬은 임포트 방식 때문에 모든 모듈은 기본적으로 싱글톤이다.
  • 파이썬 작동 방식
    • 모듈이 임포트 됐는지 확인한다.
    • 임포트 됐다면 해당 객체를 반환하고 안 됐다면 임포트하고 인스턴스화 한다.
    • 모듈은 임포트와 동시에 초기화된다. 하지만 같은 모듈을 다시 임포트 하면 초기화하지 않는다. 한 개의 객체만 유지하고 반환하는 싱글톤 방식이다.

 

 

반응형