Prompt Detail:
Концепция Singleton предполагает, что класс может иметь только один экземпляр, и этот экземпляр должен быть доступен для всех остальных частей программы. Рассмотрим три способа реализации паттерна Singleton на Python:
- Использование декоратора
pythondef 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 MyClass:
pass
- Использование метакласса
rubyclass Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class MyClass(metaclass=Singleton):
pass
- Использование модуля
rubyclass Singleton:
def __init__(self, cls):
self._cls = cls
def Instance(self):
try:
return self._instance
except AttributeError:
self._instance = self._cls()
return self._instance
def __call__(self):
raise TypeError('Singletons must be accessed through `Instance()`.')
@Singleton
class MyClass:
pass
Во всех трех примерах мы создаем класс, который может иметь только один экземпляр, и предоставляем доступ к этому экземпляру всем остальным частям программы. При использовании первого способа мы используем декоратор, который возвращает функцию-обертку, которая создает и хранит экземпляр класса. Во втором способе мы используем метакласс, который переопределяет метод call для создания и хранения экземпляра класса. В третьем примере мы создаем объект Singleton, который хранит ссылку на экземпляр класса.