Синглтон (Singleton) - это класс, имеющий только один экземпляр. В Python есть несколько синглетов, это None
, True
и False
. Тот факт, что None
является синглетом, позволяющий сравнивать None
с помощью ключевого слова is
:
if _func is None: return decorator_name else: return decorator_name(_func)
Ключевое слово is
возвращает True
только для объектов, которые являются точно таким же экземпляром. Следующий декоратор @singleton
превращает класс в 'singleton', сохраняя первый экземпляр класса в качестве атрибута. Последующие попытки создания экземпляра, будут возвращать сохраненный экземпляр:
import functools def singleton(cls): """Делает класс Одноэлементным классом""" @functools.wraps(cls) def wrapper(*args, **kwargs): if not wrapper.instance: wrapper.instance = cls(*args, **kwargs) return wrapper.instance wrapper.instance = None return wrapper @singleton class TheOne: pass
Как можно заметить, этот декоратор класса следует тому же шаблону, что и наши декораторы функций. Единственное отличие состоит в том, что нужно использовать class
вместо func
в качестве имени параметра, чтобы указать, что он предназначен для декоратора класса.
Посмотрим как он работает:
>>> one = TheOne() >>> two = TheOne() >>> id(one) # 140551970875600 >>> id(two) # 140551970875600 >>> one is two # True
Примечание:
Класс синглтон не так часто используются в Python, как в других языках. Эффект синглетона обычно лучше реализуется в виде глобальной переменной в модуле.