Python

[Python] Singleton Pattern 구현 - 1

비번변경 2025. 12. 5. 10:34

개요

2025.11.27-[디자인 패턴] Singleton pattern 개념과 구현 기법에서 Java 코드를 예시로 Singleton Pattern 구현 기법을 와르르 살펴보았다. 이번 글에서는 Python으로 구현하는 방법에 대해서 적어두려고 한다.

 

 

구현 방식

아래 내용은 스레드 환경에서 안전하지 않은 간단한 구현 방식이다.

 

 

유일한 객체를 생성하도록 하는 Singleton Pattern을 구현하기 위해서는 객체를 생성하는 과정에 참여해야 한다. 또한 객체를 생성한 후 초기화 과정도 두 번 수행하지 않도록 처리해야 한다.

 

- 객체 생성

아래 코드는 객체를 _instance 속성에서 관리한다. 객체에 _intance 속성이 없을 때만 객체를 생성해 _instance에 저장하는 방식이다.

class Klass:
    def __new__(cls, *args, **kwargs):
        # 객체가 _instance라는 속성을 갖고 있지 않으면
        if not hasattr(cls, '_instance'):
            print("Klass 객체 생성 중")
            cls._instance = super().__new__(cls)
        return cls._instance

확인해 보면 객체 생성을 두 번 시도했지만, 처음 시도했을 때만 __new__ 메서드가 객체를 생성해서 반환하고, 그 이후에는 이미 생성한 객체를 반환한다.

 

- 객체 초기화

객체는 하나로 유지하지만 초기화를 호출할 때마다 수행하면 객체의 속성이 달라질 수 있다. 때문에 초기화 필요 여부를 관리하는 _int 속성을 추가한다.

class Klass:
    # ... 생략 ...
    
    def __init__(self, name):
        cls = type(self)
        # 객체가 _init라는 속성을 갖고 있지 않으면
        if not hasattr(cls, '_init'):
            print("Klass 객체 초기화 중")
            self.name = name
            cls._init = True

실행해 보면 k2 객체의 속성을 출력해도 k1의 속성값이 출력되는 모습을 확인할 수 있다.

 

 

참고 문서

https://wikidocs.net/69361

https://refactoring.guru/ko/design-patterns/singleton/python/example

 

 

728x90