Source code for core_mixins.decorators.singleton

# -*- coding: utf-8 -*-

"""
Singleton pattern decorator for ensuring single
instance classes.
"""

import threading
from functools import wraps
from typing import Any, Callable, Optional, Type


class _SingletonWrapper:
    """
    Wrapper class to ensure only one instance of
    decorated class.
    """

    def __init__(self, cls: Type) -> None:
        self.cls = cls
        self.instance: Optional[Any] = None
        self._lock = threading.Lock()
        wraps(cls)(self)

    def __call__(self, *args: Any, **kwargs: Any) -> Any:
        if self.instance is None:
            with self._lock:
                if self.instance is None:
                    self.instance = self.cls(*args, **kwargs)

        return self.instance


[docs] def singleton(cls: Type) -> Callable: """ Make a class a Singleton class (only one instance) :param cls: The class being decorated. :type cls: ``Type`` :return: The wrapped function. :rtype: Callable """ return _SingletonWrapper(cls)