Синглтон шаблон в Python - PullRequest
       1

Синглтон шаблон в Python

0 голосов
/ 16 сентября 2018

Я новичок в Python и пытаюсь выучить этот язык, проверяя и создавая примеры шаблонов проектирования в Python.

У меня путаница с классической реализацией Singleton Pattern.В большинстве статей упоминается о реализации Singleton как классической

class Singleton(object):
    name = None

    @staticmethod
    def instance():
        if '_instance' not in Singleton.__dict__:
            Singleton._instance = Singleton()

        return Singleton._instance


s1 = Singleton().instance();
s2 = Singleton().instance();

assert s1 is s2

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

Другая реализация, на которую мне указали, это

class Singleton(object):
    _instances = {}

    def __new__(class, *args, **kwargs):
        if class not in class._instances:
            instance = super().__new__(class)
            class.__instances[class] = instance
        return class._instances[class]

И это заставило меня задуматься.Может кто-нибудь объяснить мне, как это работает?

1 Ответ

0 голосов
/ 16 сентября 2018

Первое, что нужно иметь в виду, это Python - это не Java . Это не так ограничительно, как другие языки. Как говорит Гвидо, «мы все здесь взрослые». Ничто действительно не мешает вам делать большинство вещей в Python. Решение - не делай этого.

Однако есть несколько способов сделать синглтоны. Другой способ, который выглядит более «естественным» для пользователя, заключается в использовании фабричной функции, которая выглядит как создание класса. Вот пример.

class _Singleton:
    _instance = None

    def hello(self):
        print("Hello!")


def Singleton():
    if _Singleton._instance is None:
        _Singleton._instance = _Singleton()
    return _Singleton._instance



s1 = Singleton()
s2 = Singleton()

assert s1 is s2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...