싱글톤(Singleton)
싱글톤(Singleton)
Singleton 디자인 패턴은 클래스가 하나의 인스턴스만을 갖도록 하고, 그 인스턴스를 시스템 전여겡서 액세스할 수 있도록 하는 패턴이다. Python에서 싱글톤 클래스가 하나의 인스턴스를 갖도록 하기 위해서 __init__()
함수에서 객체 생성을 금지시키게 되는데, 일반적으로 __init__
안에서 raise Exception()
을 사용하게 된다. 싱글톤에서 생성되는 하나의 인스턴스는 실제 클래스 메서드를 사용하여 아래 예제의 get_instance()
와 같이 캐시된 _instance
가 없는 경우 새로 생성하고, 이미 있는 경우 그 _instance
필드값을 리턴하는 방식을 사용한다.
class Singleton:
_instance = None
def __init__(self):
raise Exception("Unable to create new instance:)
@classmethod
def get_instance(cls):
if cls._instance is None:
cls._instance = cls.__new__(cls)
return cls._instance
싱글톤 사용하기
Singleton 인스턴스르 사용하기 위해서는, 클래스 객체를 개별적으로 생성하는 대신 Singleton 클래스의 싱글톤 생성 클래스 메서드(get_instance
)를 사용한다. 예를 들어, 아래 예제에서 Singleton.get_instance()
를 호출하여 싱글톤 인스턴스를 가져온 후, show_time()
과 같은 인스턴스 메서드를 호출한다.
import datetime
class Singleton:
_instance = None
def __init__(self):
raise Exception("Unable to create new instance:)
@classmethod
def get_instance(cls):
if cls._instance is None:
cls._instance = cls.__new__(cls)
return cls._instance
def show_time(self):
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))
inst = Singleton.get_instance()
inst.show_time()
싱글톤 파생클래스 사용
Singleton 클래스를 생성한 후, 여기서 클래스를 파생하는 방식으로 싱글톤 패턴을 사용할 수 있다. 파생클레스에서 싱글톤 객체를 생성하기 위해서는, 부모클래스의 get_instance()
를 호출하여 사용하고, 부모 혹은 파생클래스의 인스턴스 메서드를 호출하면 된다. 아래 예제는 SIngleton 부모 클래스에서 MyClass
파생클래스를 생성하고, 사용한 예를 표현한 것이다.
class MyClass(Singleton):
def start(self):
print("START")
my = MyClass.get_instance()
my.start()
그리고 (부모 클래스의 get_instance()
를 사용하는 대신) 파생클래스에서 get_instance()
클래스 메서드를 재정의(overried)하여 사용할 수도 있는데, 이는 파생클래스의 멤버를 초기화하는데 유용하다.
출처: http://pythonstudy.xyz/python/article/518-%EC%8B%B1%EA%B8%80%ED%86%A4-Singleton