Как получить экземпляр класса в Python
Я пытаюсь написать несколько тестов для оценки ответа сервера путем создания клиента через веб-сокеты. Я использую автобан для установления соединения. Однако мне кажется, что я не могу отправить сообщение на сервер, потому что мне требуется активный в данный момент экземпляр класса протокола для запуска sendMessage. Вот код:
class SlowSquareClientProtocol(WebSocketClientProtocol):
def onOpen(self):
print "Connection established"
def onMessage(self, payload, isBinary):
if not isBinary:
res = json.loads(payload.decode('utf8'))
print("Result received: {}".format(res))
self.sendClose()
def onClose(self, wasClean, code, reason):
if reason:
print(reason)
reactor.stop()
class NLVRTR(TestFixture,SlowSquareClientProtocol):
@classmethod
def setUpClass(self):
log.startLogging(sys.stdout)
factory = WebSocketClientFactory(u"ws://someURL:8078")
factory.protocol = SlowSquareClientProtocol
reactor.connectTCP("someURL", 8078, factory)
wsThread = threading.Thread(target = reactor.run,
kwargs={'installSignalHandlers':0})
wsThread.start()
def test_00_simple(self):
WSJsonFormatter = WSformat()
x = WSJsonFormatter.formatGetInfo(2)
self.sendMessage(json.dumps(x).encode('utf8'))
print("Request to square {} sent.".format(x))
Поэтому, чтобы уточнить, я запустил клиент в методе setUpClass, и я пытаюсь отправить некоторые сообщения в test_00_simple. Тем не менее, я, кажется, получаю ошибку, как так
AttributeError: 'NLVRTR' object has no attribute 'state'
Состояние должно быть атрибутом, определенным внутри WebSocketClientProtoco. Все работает нормально, если я помещаю sendmessage в метод onOpen, но я не могу вызвать его из другого места, кроме как внутри класса SlowSquareClientProtocol. В документе для автобана было упомянуто, что
Whenever a new client connects to the server, a new protocol instance will be created
Я считаю, что это проблема, и это создает новый экземпляр протокола, и метод sendmessage использует этот экземпляр. Поскольку я не вызываю его внутри класса slowsquare..., sendmessage никогда не цеплялся за этот вновь созданный протокол, когда клиент соединяется, таким образом, с ошибкой. У меня вопрос, есть ли способ получить вновь созданный экземпляр через мой код после подключения клиента?
1 ответ
Я нашел глупый способ обойти это с помощью сборщика мусора, чтобы получить экземпляр, как это так
#Used to get the instance of the protocol
def getIn(self):
for obj in gc.get_objects():
if isinstance(obj, SlowSquareClientProtocol):
protocol = obj
return protocol
def test_00_startSession(self):
WSJsonFormatter = WSformat()
x = WSJsonFormatter.formatCreateSession("eng-USA", sessionId = "837ab900-912e-11e6-b83e-3f30a2b99389")
SlowSquareClientProtocol.sendMessage(self.getIn(),json.dumps(x).encode('utf8'))
print("Request {} sent.".format(x))
Поэтому я искал все экземпляры, которые имеют имя класса, который я ищу, а затем передал его в метод sendmessage. Я все еще открыт для других более простых предложений:)