Исходный код EJIO.utils.interface.singleton
## /utils/interface/singleton.py
from threading import Lock
from typing import TypeVar
__all__ = [
'Singleton'
]
T = TypeVar('T', bound='SingletonMeta')
class SingletonMeta(type):
"""
Мета-класс Singleton. Обеспечивает единичность экземпляра для каждого класса-наследника.
"""
__slots__ = ()
_instances: dict[T, T] = {} # type ignore[valid-type]
_lock: Lock = Lock()
def __call__(cls, *args: object, **kwargs: object) -> T: # type ignore
"""
Гарантирует, что при вызове класса, если экземпляр класса уже создавался,
то вернет именно его.
:param args: Аргументы вызова.
:param kwargs: Ключевые аргументы вызова.
:return: Экземпляр класса.
"""
with cls._lock:
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
[документация]
class Singleton(metaclass=SingletonMeta):
"""
Базовый класс Singleton.
"""
...