Во-первых, я новичок в Python и ООП, поэтому я все еще изучаю, как все работает.
Я пытаюсь перенести помощник API веб-сокета в новую библиотеку веб-сокетов, поскольку в исходной библиотеке есть ошибки, а репозиторий Github неактивен. Новая библиотека (autobahn-twisted) является асинхронной и работает через обратные вызовы, где исходная библиотека помещает новые ответы в очередь для синхронной обработки. Это добавляет еще один уровень сложности, который я все еще изучаю.
В настоящее время есть 3 модуля, которые я создал / изменил. Это:
- connector.py
- содержит класс протокола, который расширяет WebsocketClientProtocol
- Протокол обрабатывает низкоуровневое взаимодействие с API, например форматирование сообщений для отправки, а также прием и обработку (низкий уровень) ответов
- client.py
- содержит класс Client, который расширяет протокол
- Клиент содержит функции более высокого уровня для отмены / подписки на потоки и доступа к другим конечным точкам API
- user_code.py
- содержит класс userClass
- В моем первоначальном проекте планировалось, что этот модуль будет наследоваться от Клиента для выполнения операций и обработки данных ответа
Моя проблема в классе userClass и его взаимодействии с другими классами. Я хочу иметь возможность вызывать методы userClass изнутри класса Protocol, когда сообщения принимаются и обрабатываются, и вызывать методы Client из userClass для запроса сообщений и подписки на потоки.
Для первой попытки я создал абстрактный класс, содержащий все методы, которые я хотел вызвать, и использовал userClass для реализации всех их. Это (я думаю) означало, что я мог безопасно вызывать дочерние методы из родительских методов, но я не мог вызывать методы Client из userClass без создания циклической ссылки, и это казалось хрупким (или, другими словами, все ломалось), когда я переехал вещи в новый модуль.
Моя вторая попытка имела Client в качестве объекта в userClass, используя отношение агрегации. Внутри Client и Protocol я ссылался на класс userCode, а не на объект, однако при вызове методов я терял ссылки на объект.
Я еще не пытался использовать прямое наследование с пользовательским классом, наследующим Client и перезаписывающим «фиктивные» методы из родительских классов, так как казалось, что было много дублирования кода.
Этот пример показывает функциональность, которую я хотел бы
class Protocol(WebsocketClientProtocol)
def onOpen(self):
print("open")
connectionOpened()
def send(self, msg):
self.sendMessage(json.dumps(msg))
class Client(Protocol)
def subscribe(self, msg)
self.send("subscribe_" + msg)
class userClass(Client)
def connectionOpened(self):
subscribe("this_stream")
Какую парадигму дизайна мне следует придерживаться, чтобы получить такое поведение?
Заранее спасибо