2016-07-14 23 views
0

Ich fragte mich, ob dieser Ansatz für die Erstellung eines Singleton korrekt war.Wie erstelle ich ein Singleton?

my_class.py

class MyClass(object): 
    def a_method(self): 
     print("Hello World") 
    ... 

MY_CLASS_SINGLETON = MyClass() 

ein weiteres Modul:

from my_class import MY_CLASS_SINGLETON 

if __name__ == "__main__": 
    MY_CLASS_SINGLETON.a_method() 

Also dieser Code arbeitet für mich, aber mein Wunder, wenn der Garbage Collector die MY_CLASS_SINGLETON Instanz zerstören könnte, bevor es von einem anderen verwendet wird, Modul, als am Ende ist es nur eine temporäre Variable im Modul.

+3

Es ist keine "temporäre Variable". Es ist ein Name, der in Ihrem Modul definiert ist. Python wird auch nicht Müll sammeln 'MyClass', obwohl das auch nur ein benanntes Objekt in Ihrem Modul ist. – deceze

+0

Ok, ich wusste nichts über den Umfang. Und über den "Singleton" ist es wahr, dass ich mehr Instanzen erstellen kann, aber in meinem Fall mache ich mir darüber keine Sorgen. Danke für die Klärung aber :) EDIT: Teil dieser Antwort war nicht für Sie, sondern für @AnnetteC, tut mir leid für die Konfuziation. –

+0

Mögliches Duplikat von [Gibt es eine einfache, elegante Möglichkeit, Singletons in Python zu definieren?] (Http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to-define-singletons- In-Python) – pat

Antwort

0

Ich würde davon ausgehen, dass Ihre Implementierung kein sicherer Singleton ist, sofern Sie einfach neue Instanzen von MyClass erstellen können. Ein Singleton sollte dies vermeiden, indem er diese Instanz selbst hält und nur diese Instanz zurückgibt - Ihre Instanz befindet sich außerhalb der Klasse. (Aber ich bin selbst neu in Python und in dem Moment, ich nur prozeduralen geschriebenen Python-Code zu pflegen.)

Aber hast du einen Blick here?

+0

Vielen Dank für den Link. Ich hatte es schon gesehen, aber ich fand es "zu kompliziert" im Vergleich zu dem, was ich im Sinn hatte (und natürlich für meine Bedürfnisse). Und über die Möglichkeit, mehrere Instanzen zu erstellen, ist dies in Ordnung für meinen Fall. Danke. –

+0

Aber was Sie tun, ist nicht das Singleton-Muster zu implementieren. Sie stellen nur eine Konstante zur Verfügung. Wahrscheinlich ist es für Ihren Anwendungsfall in Ordnung, aber wenn andere sich auf Ihren Code verlassen und glauben, dass es ein Singleton ist, kann dies zu Problemen führen. Bitte werfen Sie einen Blick auf die Ideen des Singleton-Musters. – AnnetteC

+0

Sie haben Recht, ich habe nur den falschen Namen 'Singleton' verwendet. Das einzige, was ich vom Singleton-Muster wollte, ist, von überall auf dieselbe Instanz zugreifen zu können. –