Es scheint viele Möglichkeiten der Definition zu geben Einzelnes in Python. Gibt es eine einheitliche Meinung auf Stack Overflow?
Antworten
Zu viele Anzeigen?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:
...
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.
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.
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