Что нужно сделать
Синглтон — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Синглтонами мы уже пользовались, к ним относятся, например, None
, True
и False
. Именно потому, что None
является синглтоном, мы можем использовать оператор is
— он возвращает True
только для объектов, представляющих одну и ту же сущность.
Реализуйте декоратор singleton
, который превращает класс в одноэлементный. То есть при множественной инициализации объекта этого класса будет сохранён только первый инстанс, а все остальные попытки создания будут возвращать первый экземпляр.
Пример кода:
@singleton
class Example:
pass
my_obj = Example()
my_another_obj = Example()
print(id(my_obj))
print(id(my_another_obj))
print(my_obj is my_another_obj)
Результат:
1986890616688
1986890616688
True
Что оценивается
- Результат вычислений корректен.
- Формат вывода соответствует примеру.
- Переменные, функции и собственные методы классов имеют значащие имена, не
a
,b
,c
,d
. - Классы и методы/функции имеют прописанную документацию.
- Есть аннотация типов для методов/функций и их аргументов (кроме
args
иkwargs
). Если функция/метод ничего не возвращают, то используетсяNone
.
def singleton(cls):
"""Декоратор- определитель инициализации экземпляра класса."""
def inner():
if cls.__copy is None:
cls.__copy = cls()
return cls.__copy
cls.__copy = None
return inner