Паттерн Singleton гарантирует, что класс имеет только один экземпляр на протяжении всей жизни приложения, при этом предоставляя глобальную точку доступа к этому экземпляру.
1. Переменная на уровне модуля — самый простой подход. Модули Python импортируются один раз и кэшируются, поэтому объект на уровне модуля естественным образом ведёт себя как singleton.
2. Переопределение __new__ — контролируй создание экземпляра прямо в классе:
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
3. Декоратор — оборачивает класс, чтобы кэшировать и возвращать один и тот же экземпляр при каждом вызове:
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
4. Метакласс — переопределяет __call__ на уровне метакласса для более чистого и переиспользуемого решения:
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
**__new__**, когда поведение singleton должно находиться внутри самого классаВ многопоточных окружениях добавь блокировку, чтобы предотвратить гонку потоков при создании экземпляра.
Подход с переменной на уровне модуля для реализации Singleton в Python опирается на тот факт, что модули импортируются один раз и кэшируются интерпретатором Python, поэтому повторные импорты возвращают тот же объект модуля.
Новый — ещё не проверен сообществом
Вы