Как получить экземпляр класса в 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. Я все еще открыт для других более простых предложений:)

Другие вопросы по тегам