Каков наилучший способ реализации синглтона в Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Каков наилучший способ реализации синглтона в Python?

Сообщение Anonymous »

Этот вопрос не для обсуждения того, желателен ли шаблон проектирования Singleton, является ли он антишаблоном или для каких-либо религиозных войн, а для обсуждения того, как этот шаблон лучше всего реализовать в Python в таком это самый питонический способ. В данном случае я определяю термин «самый питонический» как означающий, что он следует «принципу наименьшего удивления»..
У меня есть несколько классов, которые станут одиночными (мой вариант использования это для логгера, но это не важно). Я не хочу загромождать несколько классов добавлением глупостей, когда я могу просто наследовать или дополнять их.
Лучшие методы:

< h2>Метод 1: Декоратор

Код: Выделить всё

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 MyClass(BaseClass):
pass
Плюсы
  • Декораторы аддитивны, что зачастую более интуитивно понятно, чем множественное наследование.
Минусы
  • Хотя объекты, созданные с помощью MyClass(), будут истинными одиночные объекты, MyClass сам по себе является функцией, а не классом, поэтому вы не можете вызывать из него методы класса. Также для

    Код: Выделить всё

    x = MyClass();
    y = MyClass();
    t = type(n)();
    
тогда x == y, но x != t && y != t

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

Код: Выделить всё

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 MyClass(Singleton, BaseClass):
pass
Плюсы
  • Это настоящий класс
Минусы
  • Множественное наследование — фу! __new__ может быть перезаписан во время наследования от второго базового класса? Приходится думать больше, чем необходимо.
Метод 3: Метакласс

Код: Выделить всё

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]

#Python2
class MyClass(BaseClass):
__metaclass__ = Singleton

#Python3
class MyClass(BaseClass, metaclass=Singleton):
pass
Плюсы
  • Это настоящий класс
  • Автоматически волшебным образом охватывает наследование
  • Использует __metaclass__ по прямому назначению (и сообщил мне об этом)
Минусы< /p>
  • Есть ли они?
Метод 4 : декоратор возвращает класс с тем же именем

Код: Выделить всё

def singleton(class_):
class class_w(class_):
_instance = None
def __new__(class_, *args, **kwargs):
if class_w._instance is None:
class_w._instance = super(class_w,
class_).__new__(class_,
*args,
**kwargs)
class_w._instance._sealed = False
return class_w._instance
def __init__(self, *args, **kwargs):
if self._sealed:
return
super(class_w, self).__init__(*args, **kwargs)
self._sealed = True
class_w.__name__ = class_.__name__
return class_w

@singleton
class MyClass(BaseClass):
pass
Плюсы
  • Это настоящий класс
  • Автоматически волшебным образом охватывает наследование
Минусы
  • Нет ли накладных расходов на создание каждого нового класса? Здесь мы создаем два класса для каждого класса, который хотим сделать синглтоном. Хотя в моем случае это нормально, я беспокоюсь, что это может не масштабироваться. Конечно, есть споры о том, не слишком ли легко масштабировать этот шаблон...
  • В чем смысл атрибута _sealed
    Невозможно вызвать методы с тем же именем в базовых классах с помощью super(), поскольку они будут рекурсивными. Это означает, что вы не можете настраивать __new__ и не можете создавать подклассы для класса, который требует вызова __init__.
Метод 5: модуль
файл модуля singleton.py
Плюсы
  • Простое лучше сложного
Минусы
  • Не лениво создавать экземпляры


Подробнее здесь: https://stackoverflow.com/questions/676 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Каков наилучший способ реализации синглтона в Python?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Каков наилучший способ реализации синглтона в Python?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Каков наилучший способ реализации синглтона в Python?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Каков наилучший способ реализации синглтона в Python?
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Каков наилучший способ реализации шаблона проектирования Singleton на C# с ограничением производительности?
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»