554 Stimmen

Gibt es eine einfache, elegante Möglichkeit, Singletons zu definieren?

Es scheint viele Möglichkeiten der Definition zu geben Einzelnes in Python. Gibt es eine einheitliche Meinung auf Stack Overflow?

15voto

Matt Alcock Punkte 11531

Die Erstellung eines Singleton-Dekorators (auch Annotation genannt) ist ein eleganter Weg, wenn Sie Klassen in Zukunft dekorieren (annotieren) wollen. Dann setzen Sie einfach @singleton vor Ihre Klassendefinition.

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

@singleton
class MyClass:
    ...

9voto

FrankS Punkte 2344

Es gibt auch einige interessante Artikel im Google Testing Blog, in denen erörtert wird, warum Singletons schlecht sind oder sein können und ein Anti-Pattern darstellen:

8voto

Mark Evans Punkte 492

Ich denke, dass erzwingen. eine Klasse oder eine Instanz zu einem Singleton zu machen, ist ein Overkill. Ich persönlich definiere gerne eine normale instanzierbare Klasse, eine halbprivate Referenz und eine einfache Fabrikfunktion.

class NothingSpecial:
    pass

_the_one_and_only = None

def TheOneAndOnly():
    global _the_one_and_only
    if not _the_one_and_only:
        _the_one_and_only = NothingSpecial()
    return _the_one_and_only

Oder wenn es kein Problem mit der Instanziierung gibt, wenn das Modul zum ersten Mal importiert wird:

class NothingSpecial:
    pass

THE_ONE_AND_ONLY = NothingSpecial()

Auf diese Weise können Sie Tests gegen neue Instanzen ohne Seiteneffekte schreiben, und es besteht keine Notwendigkeit, das Modul mit globalen Anweisungen zu überladen.

3voto

Mark Biek Punkte 140395

Das Singleton-Muster mit Python implementiert mit freundlicher Genehmigung von ActiveState.

Es sieht so aus, als ob der Trick darin besteht, die Klasse, die nur eine Instanz haben soll, innerhalb einer anderen Klasse zu platzieren.

3voto

class Singleton(object[,...]):

    staticVar1 = None
    staticVar2 = None

    def __init__(self):
        if self.__class__.staticVar1==None :
            # create class instance variable for instantiation of class
            # assign class instance variable values to class static variables
        else:
            # assign class static variable values to class instance variables

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X