Python父类能否调用子类方法?以BaseServer调用get_request为例
对SocketServer.BaseServer该设计模式的解答
这是Python标准库中典型的模板方法设计模式实现,核心逻辑是把通用流程和协议相关的具体实现解耦,具体可以从三个层面理解:
- 首先
BaseServer是抽象基类,仅定义所有类型套接字服务通用的请求处理流程,_handle_request_noblock()就是预设的通用流程模板:获取请求→处理请求→关闭请求,这套逻辑无论TCP还是UDP服务都适用,不需要重复开发。 - 其次
get_request()是约定好的、必须由子类实现的抽象方法,因为TCP和UDP的请求获取逻辑完全不同:TCPServer的get_request()会调用套接字的accept()方法,返回新建的TCP连接套接字和客户端地址,适配面向连接的传输逻辑UDPServer的get_request()会调用套接字的recvfrom()方法,返回收到的UDP数据报和客户端地址,适配无连接的传输逻辑
如果直接实例化BaseServer调用get_request(),会直接抛出NotImplementedError,属于强制子类实现的接口约定。
- 这种设计的优势非常明确:
- 最大化代码复用:上层通用的请求调度、异常处理逻辑只需要在
BaseServer中实现一次,所有子类都可以直接复用 - 扩展性极强:如果后续要实现其他传输协议的服务(比如SCTP、Unix域套接字服务),只需要继承
BaseServer,实现get_request()等少量协议相关的方法,不需要修改上层处理流程 - 符合开闭原则:上层稳定逻辑不需要修改,下层的协议实现可以自由扩展替换
- 最大化代码复用:上层通用的请求调度、异常处理逻辑只需要在
内容的提问来源于stack exchange,提问作者sensensen
相关产品推荐
相关产品推荐

