TGViewer
Python RU Python RU @pro_python_code · 12.3K subscribers
Post #438 2.51K
Singleton (Одиночка) — порождающий шаблон проектирования, гарантирующий, что в однопроцессном приложении будет единственный экземпляр некоторого класса, и предоставляющий глобальную точку доступа к этому экземпляру.

📎 Реализация синглтона через декоратор класса:

def singleton(cls):
# храним все разные синглтоны с одном словаре (класс -> экземпляр)
instances = {}
def getinstance():
# если класса нет среди ключей нашего словаря - создадим экземпляр
if cls not in instances:
instances[cls] = cls()
# вернем ссылку на него
return instances[cls]
return getinstance


Вот так мы помечаем, что класс MySingleton – синглтон:

@singleton
class MySingleton:
def __init__(self):
self.x = 10
print("__init__")


📎 Пример (проверяем единственность экземляра):

>>> x1 = MySingleton()
init
>>> x2 = MySingleton()
>>> x1 is x2
True
>>> x1.x = 100
>>> x2.x
100

•
init было вызвано единажды
• Обе переменные указывают на один экземпляр
• При изменении полей в одном экземпляре, они меняются и во втором.

Плохо то, что MySingleton здесь – это функция (результат работы декоратора), а не класс: вы не можете вызывать класс-методы у нее. Эта проблема решается использованием метаклассов.

# обратите внимание, метакласс наследован от type
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]

Прим
енение (Python 3):

class MySingleton(metaclass=Singleton):
def __init__(self):
self.x = 10
print("__init__")

⚠️ Не злоупотребляйте синглтонами, они осложняют тестирование кода.

@pro_python_code
  • 👍 13
  • ❤ 1
More from @pro_python_code
  1. Oct 11, 2026Что нового в Python 3.15? Ленивые импорты, frozendict и JIT быстрее на 12% Python 3.15 выш…
  2. Oct 6, 2026🐍 Python умеет сравнивать числа как в математике Проверку диапазона можно записать короче…
  3. Oct 4, 2026Hugging Face исследовали multi-harness RL: обучение с подкреплением сразу через Claude Cod…
  4. Oct 1, 2026DeepSeek Harness вышел на десктоп: плагины без терминала и задачи по расписанию DeepSeek в…
  5. Sep 30, 2026Пишем игру на Python: неоновая аркада с разбором кода и ИИ Pygame часто считают библиотеко…
  6. Sep 29, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →