Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
14 Май 2024
3 мин
5086

Создание Singleton в Python

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

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

Освойте Python на курсе от Skypro. Вас ждут 400 часов обучения и практики (достаточно десяти часов в неделю), подготовка проектов для портфолио, индивидуальная проверка домашних заданий и помощь опытных наставников. Получится, даже если у вас нет опыта в IT.

Пример проблемы

Рассмотрим пример, когда у нас есть класс Logger, который записывает логи в определенный файл. Каждый раз, когда мы создаем новый экземпляр этого класса, он открывает файл и начинает запись с начала. Если у нас есть несколько экземпляров класса Logger, они будут перезаписывать лог-файл, и результаты будут непредсказуемыми. В этом случае было бы намного проще и безопаснее, если бы был только один экземпляр класса Logger, который бы отвечал за запись в лог-файл.

Решение проблемы

Для решения этой проблемы можно использовать паттерн Singleton. В Python есть несколько способов реализации этого паттерна:

Метод 1: Декоратор

Декоратор — это функция, которая принимает другую функцию и расширяет ее поведение, не изменяя ее явно. При использовании декоратора для реализации Singleton, мы создаем декоратор, который проверяет, был ли уже создан экземпляр класса, и если да, то возвращает этот экземпляр вместо создания нового.

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class Logger:
    pass

Изучайте Python на онлайн-курсе от Skypro «Python-разработчик». Программа рассчитана на новичков без опыта программирования и технического образования. Курс проходит в формате записанных коротких видеолекций. Будет много проверочных заданий и мастер-классов. В конце каждой недели — живая встреча с экспертами в разработке для ответов на вопросы и разбора домашек.

Метод 2: Базовый класс

В этом методе мы создаем базовый класс Singleton, который содержит логику для проверки, был ли уже создан экземпляр класса. Затем мы создаем наш класс Logger, который наследуется от класса Singleton.

class Singleton(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class Logger(Singleton):
    pass

Метод 3: Метакласс

Метаклассы в Python — это «классы классов», которые позволяют нам контролировать поведение классов таким же образом, как классы контролируют поведение своих объектов.

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]

class Logger(metaclass=Singleton):
    pass

Метод 4: Модуль

В Python каждый модуль загружается только один раз, поэтому мы можем использовать модуль как Singleton.

# logger.py
class _Logger:
    pass

logger = _Logger()

На курсе Skypro «Python-разработчик» освоите основные инструменты программирования, получите опыт на реальных проектах и сможете стартовать в профессии уверенным новичком. Преподаватели — практикующие программисты с большим опытом, а в центре карьеры помогут составить цепляющее резюме и подготовиться к собеседованию.

Заключение

В зависимости от конкретных потребностей и условий, каждый из этих методов может быть наилучшим выбором для реализации паттерна Singleton в Python.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий