如何在discord.py类中使用装饰器?解决NameError报错问题
解决Discord.py类中事件装饰器的报错问题
错误原因
- 使用
@self.event时,self是类实例的引用,但在类定义阶段还未创建实例,因此触发NameError。 - 使用
@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
相关产品推荐
相关产品推荐

