从父类中调用子类方法;聚合,继承还是其他?

时间:2019-04-08 15:21:43

标签: python-3.x oop design-patterns autobahn twisted.internet

首先,我是python和OOP的新手,所以我仍在学习事物的工作原理。

我正在尝试将websocket API帮助程序移植到新的websocket库,因为原始库有错误并且github存储库处于非活动状态。新的库(高速公路缠绕)是异步的,并通过回调工作,原始库将新的响应放入队列中以进行同步处理。这增加了我仍在学习的复杂程度。

当前,我已经创建/修改了3个模块。这些是:

  • connector.py
    • 包含用于扩展WebsocketClientProtocol的Protocol类
    • 协议处理与API的低级交互,例如格式化消息以发送,接收和处理(低水平)响应
  • client.py
    • 包含扩展协议的Client类
    • 客户端包含用于取消/订阅流以及访问其他API端点的更高级别的功能
  • user_code.py
    • 包含userClass类
    • 我最初的设计是让此模块从Client继承来执行操作并处理响应数据

我的问题是在userClass类中,以及它与其他类的交互。我希望能够在接收和处理消息时从Protocol类内部调用userClass方法,并从userClass调用Client方法来请求消息并订阅流。

第一次尝试,我创建了一个包含所有我想调用的方法的抽象类,并使用userClass实现了所有这些方法。 (我认为)这意味着我可以从父方法安全地调用子方法,但是如果不创建循环引用就无法从userClass调用Client方法,并且当我移动时它似乎很脆弱(换句话说,一切都坏了)东西到一个新的模块。

我第二次尝试使用聚合关系将Client作为userClass中的对象。在客户端和协议内部,我引用了userCode类而不是对象,但是在调用方法时,我然后丢失了对该对象的引用。

我还没有尝试对userClass继承Client并使用父类的“ dummy”方法来覆盖直接继承,因为似乎有很多代码重复。

此示例显示了我想要的功能

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")

我应该遵循什么设计范式来获得这种行为?

预先感谢

0 个答案:

没有答案