Сообщить об ошибке.

Декорирование классов в Python.

Декоратор "Singleton" для класса в Python.

Синглтон (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, как в других языках. Эффект синглетона обычно лучше реализуется в виде глобальной переменной в модуле.