Синглтон-реализация с использованием функции - PullRequest
0 голосов
/ 26 июня 2018

Я читал о нескольких подходах к созданию одноэлементной функции в этом SO вопросе .

Я предложил другой подход

def my_singleton():

    if not my_singleton.instance:
        class MyClass:
            pass

        my_singleton.instance = MyClass()

    return my_singleton.instance

my_singleton.instance = None

Что с этим не так?подход по сравнению с другими подходами, упомянутыми в предыдущем вопросе SO?Есть ли какие-либо последствия, связанные с памятью / GC / поток безопасности / жизненный цикл экземпляра.Я спрашиваю об этом, потому что другие подходы выглядят довольно сложными для начинающего (метакласс, декораторы, базовый класс, декораторы, возвращающие класс)

1 Ответ

0 голосов
/ 26 июня 2018

Помимо проблемы с атрибутом экземпляра (AttributeError: 'function' object has no attribute 'instance'), есть еще одна проблема с этим подходом.После создания «почти одноэлементного» объекта с использованием my_singleton вы можете просто получить класс из этого объекта и создать новые объекты этого класса.

x = my_singleton()
y = my_singleton()
x == y
Out[50]: True

z = x.__class__()
type(z) == type(x)
Out[52]: True

z == x
Out[53]: False

BTW.Вот как я исправил вашу my_singleton() функцию (чтобы не вызывать ошибку атрибута, но все же это не настоящий синглтон):

def my_singleton():
    try:
        return my_singleton.instance
    except AttributeError:
        class MyClass:
            pass
        my_singleton.instance = MyClass()
        return my_singleton.instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...