我正在创建一个包含与服务器的套接字通信的Python应用程序。我想有一个模块可以用于整个应用程序(其他几个模块)。目前我模块是这样的: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]"
当我使用这个在其他模块中我做了以下内容:
import SocketCommunication
self.sc = SocketCommunication()
的问题是,每次我这样做的时候,创建一个新的连接,将为在服务器上显示为新客户端,这是不可取的。 从我能读的东西中,应该避免使用Python中的单例,因此我很好奇这种类型的问题的最佳做法是什么?
阅读关于** _ Borg Design Pattern _ ** [这里](http://code.activestate.com/recipes/577870-singleton-we-dont-need-no-stinkin-singleton-the-bo/ )和[这里](http://code.activestate.com/recipes/66531/)提供了一种将类转换为单例的简单方法。还有其他方法。 – martineau
我会使用这个类作为一个单例。我从来没有遇到过这种方法的问题。 – Alfe
您说您在其他模块中执行的'import SocketCommunication'将不起作用,因为'SocketCommunication'是您的其中一个类的名称。它需要像'from my_module import SocketCommunication'那样才能使下一行有效。也就是说,在定义类之后,可以有效地使该类成为在my_module.py文件中添加'SocketCommunication = SocketCommunication()'的单例。这样一来,创建更多实例将非常困难,因为类名将被自身的实例覆盖。 – martineau