Как бы реализовал паттерн singleton ?

Спросят с вероятностью 3%



Паттерн Singleton используется для того, чтобы создать класс, который имеет только один экземпляр. Это полезно, когда нужно ограничить количество объектов, например, для управления ресурсами (как подключение к базе данных) или для хранения глобального состояния.



Существует несколько способов реализовать Singleton. Рассмотрим один из наиболее распространенных способов - использование приватного конструктора и класса-метода для получения экземпляра.

class Singleton:

__instance = None



def __new__(cls, args, kwargs):

if cls.__instance is None:

cls.__instance = super(Singleton, cls).__new__(cls, args, kwargs)

return cls.__instance



def __init__(self):

if not hasattr(self, 'initialized'):

self.initialized = True

# Инициализация объекта, если нужно

self.value = 0



# Проверка работы

singleton1 = Singleton()

singleton2 = Singleton()



print(singleton1 is singleton2) # Выведет: True

print(singleton1.value) # Выведет: 0

singleton1.value = 42

print(singleton2.value) # Выведет: 42




Объяснение кода



1️⃣Приватный атрибут _instance_:

Этот атрибут используется для хранения единственного экземпляра класса.



2️⃣Метод __new__:

__new__ - это метод, который создаёт новый экземпляр класса. Если экземпляр уже существует (cls.__instance не None), возвращается существующий экземпляр.

Если экземпляр ещё не был создан, super(Singleton, cls).__new__(cls, args, kwargs) создаёт новый экземпляр и сохраняет его в cls.__instance.



3️⃣Метод init:

Методреализовалвызывается каждый раз при создании экземпляра. Чтобы избежать повторной инициализации, проверяем наличие атрибута initialized.



Можно также реализовать Singleton с помощью декоратора:

def singleton(cls):

instances = {}

def get_instance(*args, **kwargs):

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

return get_instance



@singleton

class SingletonClass:

def __init__(self):

self.value = 0



# Проверка работы

singleton1 = SingletonClass()

singleton2 = SingletonClass()



print(singleton1 is singleton2) # Выведет: True

print(singleton1.value) # Выведет: 0

singleton1.value = 42

print(singleton2.value) # Выведет: 42




Объяснение



1️⃣Декоратор singleton:

Хранит экземпляры класса в словаре instances.

Если экземпляра класса ещё нет в словаре, он создаётся и добавляется в словарь.

Возвращается существующий или новый экземпляр класса.



Паттерн Singleton гарантирует, что класс имеет только один экземпляр. Это достигается контролем создания экземпляров через методые None), или декоратор. Singleton полезен для управления ресурсами и глобального состояния.



👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент



🔐 База собесов | 🔐 База тестовых