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

如何在discord.py类中使用装饰器?解决NameError报错问题

解决Discord.py类中事件装饰器的报错问题

错误原因

  1. 使用@self.event时,self是类实例的引用,但在类定义阶段还未创建实例,因此触发NameError。
  2. 使用@bot.event时,bot是类实例化后的对象,但类定义时bot还未被定义,同样报错。

正确实现方式

对于commands.Bot的子类,无需使用@event装饰器,直接重写Bot类内置的事件方法即可,比如on_ready、on_message都是Bot类原生支持重写的方法:

import discord
import os
from dotenv import load_dotenv
from discord.ext import commands, tasks


class MyBot(commands.Bot):

    def __init__(self):
        super().__init__(command_prefix='.', intents=discord.Intents.all())
    
    # 直接重写on_ready方法,无需装饰器
    async def on_ready(self):
        print(f'{self.user} is now running!')
        # 在这里添加你的业务逻辑

    # 直接重写on_message方法
    async def on_message(self, message):
        # 重要:重写on_message后必须手动调用此方法,否则机器人无法响应命令
        await self.process_commands(message)
        # 在这里添加你的消息处理逻辑


bot = MyBot()
load_dotenv()
bot.run(os.getenv('TOKEN'))

额外注意事项

  • 重写on_message方法时,必须调用await self.process_commands(message),否则机器人无法识别并执行你定义的命令。
  • 如果需要添加自定义事件(非Discord原生事件),可以在__init__方法中通过self.add_listener()注册:
    def __init__(self):
        super().__init__(command_prefix='.', intents=discord.Intents.all())
        # 注册自定义事件监听器
        self.add_listener(self.my_custom_event, 'on_my_custom_event')
    
    async def my_custom_event(self, data):
        # 自定义事件处理逻辑
        print(f"自定义事件触发:{data}")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:57:46