Во-первых, есть класс IO
, которому на __init__
передается объект асинхронного цикла (io = IO(loop)
), созданный ранее в основном классе. IO
затем в какой-то момент инициализирует класс Socket
, выполнив self.socket = Socket(self)
, чтобы объект сокета имел обратный доступ. Позже класс Socket
инициализирует класс Websocket
, который является подклассом Transport
.
class Websocket(Transport):
name = 'websocket'
def __init__(self, socket):
self.socket = socket
def open(self):
url = self.prepareUrl()
factory = WebSocketClientFactory(url, debug = False)
factory.protocol = Protocol
websocket = self.socket.loop.create_connection(factory, host=self.socket.io.options.host, port=self.socket.options.port)
self.socket.io.loop.run_until_complete(websocket)
def onOpen(self):
print('print me please!')
Таким образом, объект сокета вызывает self.transport.open()
(где self.transport = Websocket(self)
), который создает фабрику автобанов, создает асинхронное соединение, выполняя self.socket.loop.create_connection()
, а затем добавляет coro future в цикл, выполняя run_until_complete()
.
Вот тут-то и начинается проблема: для фабрики автобанов требуется класс, который должен наследоваться от autobahn.asyncio.websocket.WebSocketClientProtocol
.
Мой класс Protocol(WebSocketClientProtocol)
имеет обычный:
class Protocol(WebSocketClientProtocol):
@asyncio.coroutine
def onOpen(self):
print('socket opened!')
Это отлично работает, print('socket opened!')
печатает строку, и мой сервер также говорит, что соединение открыто.
Вопрос: из класса Protocol(), когда обратный вызов onOpen() вызывается автобаном, как я могу заставить этот метод вызывать метод transport.onOpen() и выполнять print('print me please!')
?
Protocol.onOpen()
я мог сделать что-то вродеself.factory.loop.socket.transport.onOpen()
. Чтобы сделать вещи немного более красивыми, я могу передать объект цикла в качестве базовой линии, которая будет иметь структуру, подобнуюloop.io.socket.transport
. Но опять же, был ли объект цикла действительно предназначен для хранения сторонних ссылок внутри себя? Для меня это выглядит слишком хакерским... - person simon   schedule 08.01.2016