You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套类如何访问外部类属性?Python UDP服务类队列成员访问问题

问题原因与修复方案

核心问题点

  1. 线程创建逻辑错误:你在初始化threading.Thread时给target参数传入了self._server_thread(),相当于直接执行了服务启动方法,会阻塞主线程,正确写法应该传入方法对象而非执行方法的返回值。
  2. 嵌套类的属性访问逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 07:57:02