嵌套类如何访问外部类属性?Python UDP服务类队列成员访问问题
问题原因与修复方案
核心问题点
- 线程创建逻辑错误:你在初始化
threading.Thread时给target参数传入了self._server_thread(),相当于直接执行了服务启动方法,会阻塞主线程,正确写法应该传入方法对象而非执行方法的返回值。 - 嵌套类的属性访问逻辑错误:
UDPHandler作为RsaServer的内部类,无法直接访问外层RsaServer实例的成员变量,socketserver的Handler实例自带server属性指向启动它的UDPServer实例,你可以借助这个属性传递队列对象。
具体修复步骤
- 修正线程创建的参数,去掉
_server_thread后的括号 - 在
_server_thread方法中,创建完UDPServer实例后,将当前RsaServer的messages队列绑定到UDPServer实例上 - 在
UDPHandler的handle方法中,通过self.server.messages访问队列存入消息
修正后的完整代码
import socketserver import threading, queue class RsaServer: def __init__(self, host="localhost", port=9999): self.host = host self.port = port self.messages = queue.SimpleQueue() # 修正:target传入方法对象,不要加括号执行 self.main_thread = threading.Thread(target=self._server_thread) # 配置守护线程,主进程退出时自动关闭服务线程 self.main_thread.daemon = True self.main_thread.start() def _server_thread(self): with socketserver.UDPServer((self.host, self.port), self.UDPHandler) as server: # 把RsaServer的队列绑定到UDPServer实例上,供Handler访问 server.messages = self.messages server.serve_forever() class UDPHandler(socketserver.BaseRequestHandler): """Used to handle incoming communications to the server""" def handle(self): data = self.request[0].strip() socket = self.request[1] try: message = data.decode() except UnicodeDecodeError: pass else: # 通过server属性拿到绑定的队列,存入消息 self.server.messages.put(message)
验证方法
实例化RsaServer后,向对应端口发送UDP包,再调用实例的messages.get()即可获取存入的消息。
内容的提问来源于stack exchange,提问作者mikekehrli
相关产品推荐
相关产品推荐

