33 lines
1.1 KiB
Python
33 lines
1.1 KiB
Python
import threading
|
|
|
|
|
|
def singleton(cls):
|
|
"""
|
|
클래스 형태를 유지하는 싱글톤 데코레이터.
|
|
- 여러 번 호출해도 동일 인스턴스 반환
|
|
- __init__은 최초 1회만 실행
|
|
- 스레드-세이프
|
|
"""
|
|
cls.__singleton_lock__ = getattr(cls, "__singleton_lock__", threading.Lock())
|
|
cls.__singleton_instance__ = getattr(cls, "__singleton_instance__", None)
|
|
|
|
orig_init = cls.__init__
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
# 최초 1회만 실제 __init__ 수행
|
|
if getattr(self, "__initialized__", False):
|
|
return
|
|
orig_init(self, *args, **kwargs)
|
|
setattr(self, "__initialized__", True)
|
|
|
|
def __new__(inner_cls, *args, **kwargs):
|
|
if inner_cls.__singleton_instance__ is None:
|
|
with inner_cls.__singleton_lock__:
|
|
if inner_cls.__singleton_instance__ is None:
|
|
inner_cls.__singleton_instance__ = object.__new__(inner_cls)
|
|
return inner_cls.__singleton_instance__
|
|
|
|
cls.__init__ = __init__
|
|
cls.__new__ = staticmethod(__new__)
|
|
return cls
|