Python-singleton - / Objekt-Instanziierung
Ich Lerne Python und ich habe versucht, zu implementieren eines Singleton-Typ-Klasse als test. Den code habe ich wie folgt:
_Singleton__instance = None
class Singleton:
def __init__(self):
global __instance
if __instance == None:
self.name = "The one"
__instance = self
else:
self = __instance
Dies funktioniert teilweise, aber das selbst = __ - Instanz Teil scheint zu scheitern. Ich habe eine Ausgabe von dem Interpret zu demonstrieren (der code oben ist gespeichert in singleton.py):
>>> import singleton
>>> x = singleton.Singleton()
>>> x.name
'The one'
>>> singleton._Singleton__instance.name
'The one'
>>> y = singleton.Singleton()
>>> y.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Singleton instance has no attribute 'name'
>>> type(y)
<type 'instance'>
>>> dir(y)
['__doc__', '__init__', '__module__']
Ist es möglich, das zu tun, was ich versuche? Wenn nicht gibt es einen anderen Weg, dies zu tun?
Alle Vorschläge willkommen.
Cheers.
Anderen als eine interessante übung lernen, haben Sie einen Anwendungsfall für diese Singleton? Manchmal Singletons sein kann, viel einfacher als diese. Das Singleton-Entwurfsmuster -- Umfang -- ist ein Smalltalk/C++/Java-ism, die nicht oft gebraucht werden, in Python.
InformationsquelleAutor JonahSan | 2009-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuweisung an ein argument oder jede andere lokale variable (barename) nicht immer, vielleicht haben Sie keine Wirkung außerhalb der Funktion; das gilt für Ihre
self = whatever
wie es wäre, andere Zuordnung zu einem (barename) argument oder eine andere lokale variable.Eher, überschreiben
__new__
:Ich getan habe, andere Verbesserungen hier, wie Entwurzelung der globalen, die old-style-Klasse, etc.
VIEL besser ist die Verwendung Borg (aka monostate) anstatt der gewählten Highlander (aka singleton), aber das ist ein anderes Problem von dem du fragst nach;-).
Vielen Dank dafür! Ich denke, ich habe nicht meinen Kopf um die init - Methode, so viel wie ich dachte, ich hatte, ich wurde getäuscht durch den selbst.Namen bewirken das Objekt aber ich denke, das ist ein bisschen Python-magic?. Die Frage war mehr über das Verständnis von Python als Sie das Singleton-Muster, aber ich ' ll überprüfen Sie heraus die Borg link jedenfalls 🙂
selbst.name ist ein QUALIFIZIERTER name, nicht ein BARENAME: die Zuordnung zu einer barename und der Zuordnung zu einem qualifizierten Namen sind möglicherweise VÖLLIG andere Operationen -- widme ich ein bisschen Platz in den entsprechenden Kapiteln von "Python in a Nutshell", zu viel zu wiederholen, alles, was hier, so schlage ich vor, Sie Lesen, dass (vielleicht aus einer der vielen Raubkopien im Netz: wie der Autor glücklich bin ich NICHT über Sie, aber es gibt sicher eine große Anzahl!-)
Vielleicht bin ich etwas fehlt, aber sollte nicht jeder
__instance
werdencls.__instance
undtype
sollteobject
??rechts, fest, dass.
InformationsquelleAutor Alex Martelli
Bruce Eckel ' s code-snippet aus Design-Muster: ich bin verwirrt, wie es funktioniert
InformationsquelleAutor Dustin Getz
Von Singleton-Muster (Python):
Diese Weise der Implementierung der Singleton-Anrufe init zweimal, und das verursachte mir eine Menge Kopfschmerzen, indem die modifizierten Variablen wieder auf die original-Initialisierungen.
InformationsquelleAutor Corey D
Dies ist über die meisten basic-Singleton können Sie machen. Es verwendet eine - Klasse-Methode um zu überprüfen, ob der singleton erstellt wurde und macht einen neuen, wenn er noch nicht. Es gibt mehr fortgeschrittene Möglichkeiten, wie das überschreiben der
__neue__
Methode.Als für den Grund, warum dein code nicht funktioniert, gibt es mehrere Gründe. Erste, von der Zeit
__init__
genannt wird, ein neues Objekt wurde bereits erstellt, Sieg über den Zweck des singleton-Musters. Zweitens, wenn Sie sagenself = __instance
, die einfach setzt die lokale variable selbst ist; das wäre ähnlich zu sagen,Da Variablen in Python sind per value übergeben und nicht die Referenz, man kann nicht sagen
self = blah
habe und es sinnvoll in der Art und Weise, die Sie wollen. Die oben genannten Singleton-Klasse ist mehr das, was Sie wollen, es sei denn, Sie möchten Holen Sie sich Lust und Aussehen in überschreiben der__new__
Betreiber.InformationsquelleAutor Eli Courtwright
Diese nicht tun, was Sie erwarten, es zu tun. Lesen Sie, wie Python behandelt Namen.
InformationsquelleAutor truppo