Создать синглтон-класс с декоратором

Синглтон - это шаблон, который ограничивает создание экземпляра класса одним экземпляром / объектом. Используя декоратор, мы можем определить класс как одноэлементный, заставив класс либо вернуть существующий экземпляр класса, либо создать новый экземпляр (если он не существует).

 def singleton(cls):    
    instance = [None]
    def wrapper(*args, **kwargs):
        if instance[0] is None:
            instance[0] = cls(*args, **kwargs)
        return instance[0]

    return wrapper

 

Этот декоратор может быть добавлен в любое объявление класса и будет обеспечивать создание не более одного экземпляра класса. Любые последующие вызовы вернут уже существующий экземпляр класса.

 @singleton
class SomeSingletonClass:
    x = 2
    def __init__(self):
        print("Created!")

instance = SomeSingletonClass()  # prints: Created!
instance = SomeSingletonClass()  # doesn't print anything
print(instance.x)                # 2

instance.x = 3
print(SomeSingletonClass().x)    # 3

 

Поэтому не имеет значения, обращаетесь ли вы к экземпляру класса через локальную переменную или создаете другой «экземпляр», вы всегда получаете один и тот же объект.