Вызов методов дочерних классов из родительских классов; агрегация, наследование или другое? - PullRequest
0 голосов
/ 08 апреля 2019

Во-первых, я новичок в 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")

Какую парадигму дизайна мне следует придерживаться, чтобы получить такое поведение?

Заранее спасибо

...