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

Python类内绑定MQTT回调函数触发NameError报错的解决咨询

问题解决方法

错误原因

on_connect是HasadCoreManager类的实例方法,直接使用on_connect会被Python当作全局变量查找,找不到就触发NameError。此外代码里还有两处额外问题:

  • startLooping里的on_message同样未通过实例引用
  • on_connect方法中on_message()的写法错误,加括号会立即执行函数,无法注册为回调

修复步骤

  1. 引用类内实例方法必须加self:在startLooping方法中,将回调赋值改为通过self.方法名访问类内的实例方法
  2. 回调参数传递方法引用而非执行结果:on_connect里的client.message_callback_add参数要去掉括号,传递方法本身而非执行后的返回值

修正后的完整代码

class HasadCoreManager:

    # MQTT连接成功回调
    def on_connect(self, client, userdata, flags, rc):
        print("Connected with result code "+str(rc))
        client.subscribe(constants.MQTT_PATH_SUBSCRIBE)
        # 传递方法引用,用self访问类内的on_message方法
        client.message_callback_add("hasadNode/water", self.on_message)
        client.message_callback_add("hasadNode/air", self.on_message)

    # 补充实现on_message实例方法(若未定义)
    def on_message(self, client, userdata, msg):
        # 此处编写消息处理逻辑
        print(f"收到消息: {msg.payload.decode()},主题: {msg.topic}")

    def startLooping(self):
        print("Core Just started...")
        client = mqtt.Client()
        print("MQTT Client initialized")
        # 通过self绑定类内的回调方法
        client.on_connect = self.on_connect
        client.on_message = self.on_message
        client.connect(constants.MQTT_SERVER, 1883, 60)
        client.loop_start()

额外说明

如果on_message是全局定义的函数,可直接写on_message(无需self.),但更推荐将所有与核心逻辑相关的回调封装到类内部,提升代码的封装性和可维护性。

内容的提问来源于stack exchange,提问作者mohammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:24:52