Python-реализация Singleton - PullRequest
       12

Python-реализация Singleton

0 голосов
/ 20 сентября 2011

код идет первым:

def singleton(cls):
    instances = {}
    def get_instance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return get_instance

@singleton
class A:
    #...

Хорошо, приведенный выше код является реализацией Singleton, я видел эту реализацию в другом посте .

Я не понимаю, почему одноэлементная функция возвращает функцию, но A является классом. Как это работает?

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

А не класс в конце концов. Класс A создается, но затем заменяется функцией, которую возвращает singleton. Итак, в конце концов, A оказывается функцией.

Но так как вы вызываете класс для создания объекта, он в итоге работает почти так же. Но экземпляр не сработает.

P.S. Вы, вероятно, не должны использовать синглтон. В питоне это почти всегда неправильный выбор.

1 голос
/ 20 сентября 2011

Когда вы вызываете MyClass() после того, как он оформлен, вы правы - вы на самом деле не вызываете класс, вы вызываете функцию.

Эта функция вызывает класс if cls not in instancesи кэширует его, затем возвращает кэшированный экземпляр.

Другими словами, нет никакой причины, по которой MyClass() должен вызывать класс напрямую - он будет работать, как и ожидалось, до тех пор, пока он возвращает экземпляр класса.

...