Ich erstelle eine Python-Anwendung, die Socket-Kommunikation mit einem Server enthält. Ich würde gerne ein Modul haben, das während meiner gesamten Anwendung (mehrere andere Module) verwendet werden kann. Derzeit sehen mein Modul wie folgt aus:Einzelne Instanz der Klasse in Python
class SocketCommunication:
def __init__(self):
self.socketIO = SocketIO(settings.ADDRESS, settings.PORT, Namespace)
def emit(self, message, data):
json_data = json.dumps(data.__dict__)
self.socketIO.emit(message, json_data)
class Namespace(BaseNamespace):
def on_connect(self):
print '[Connected]'
def on_disconnect(self):
print "[Disconnected]"
Wenn ich diese Verwendung in anderen Modulen ich folgendes:
import SocketCommunication
self.sc = SocketCommunication()
Das Problem ist, dass jedes Mal, wenn ich dies tun, eine neue Verbindung erstellt wird, das wird Als neuer Client auf dem Server angezeigt werden, was unerwünscht ist. Von dem, was ich lesen kann, sollten Singletons in Python vermieden werden und daher bin ich neugierig, was ist die beste Praxis für diese Art von Problem?
Lesen Sie über die ** _ The Borg Entwurfsmuster _ ** [hier] (http://code.activestate.com/recipes/577870-singleton-we-dont-need-no-stinkin-singleton-the-bo/) und [hier] (http://code.activestate.com/recipes/66531/) für eine einfache Möglichkeit, eine Klasse in einen Singleton umzuwandeln. Es gibt auch andere Möglichkeiten. – martineau
Ich würde die Klasse selbst als Singleton verwenden. Ich hatte nie Probleme mit diesem Ansatz. – Alfe
Die 'import SocketCommunication', die Sie in den anderen Modulen ausführen, würde nicht funktionieren, weil' SocketCommunication' der Name einer Ihrer Klassen ist. Es müsste etwas wie 'from my_module import SocketCommunication' sein, damit die nächste Zeile gültig ist. Das heißt, Sie könnten die Klasse effektiv zu einem Singleton machen, der 'SocketCommunication = SocketCommunication()' in 'my_module.py' hinzufügt, nachdem die Klasse definiert wurde. Auf diese Weise wird es sehr schwierig, weitere Instanzen zu erstellen, da der Klassenname mit einer Instanz von sich überschrieben werden muss. – martineau