Использование лямбды для реализации шаблона Singleton - PullRequest
0 голосов
/ 09 декабря 2018

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

def singleton_function (c):
    print("singleton_function")
    x = c()
    return lambda : x

@singleton_function
class A:
    pass

def test2 () :
    x = A()
    y = A()
    assert x == y

test2()

Вывод:

python3 test.py
singleton_function

Почему функция singleton_function доступна только один раз?A имеет функцию типа, поэтому я предполагаю, что при вызове A, A () он возвращает x, который является экземпляром класса A, поэтому он должен был дважды вывести «singleton_function», так как я обращаюсь дважды.Что я не так думаю?

1 Ответ

0 голосов
/ 09 декабря 2018

Рассмотрим синтаксис декоратора:

def singleton_function (c):
    print("singleton_function")
    x = c()
    return lambda : x


@singleton_function
class A:
    pass

По сути, это говорит о том, что:

A = singleton_function(A)

И singleton_function() создает один экземпляр A, а затем возвращает функцию, которая указываетк этому экземпляру.

Таким образом, мы получаем

A = lambda: x

Где x - это экземпляр исходного класса A. Вызов A() возвращает x, который по-прежнему тот же самый экземпляр, что singleton_function() первый созданный.

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