Я создаю приложение 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 следует избегать Singletons, и поэтому мне интересно, что лучше всего подходит для этого типа проблем?
Подробнее о ** _ The 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
«Импорт SocketCommunication», который вы говорите в других модулях, не будет работать, потому что «SocketCommunication» - это имя одного из ваших классов. Это должно быть что-то вроде 'from my_module import SocketCommunication', чтобы следующая строка была действительной. Тем не менее, вы могли бы эффективно сделать класс singleton, добавляя 'SocketCommunication = SocketCommunication()' в файл 'my_module.py' после определения класса. Таким образом будет очень сложно создать еще несколько экземпляров, потому что имя класса будет переопределено экземпляром самого себя. – martineau