Discord.py中Bot类添加命令装饰器报错及命令不识别问题求助
问题分析与解决
1. 命令调用时的参数错误(AttributeError: 'int' object has no attribute 'channel')
错误根源是类方法与@commands.command装饰器的适配冲突:
@commands.command装饰器默认针对普通函数设计,会把命令的第一个参数判定为ctx(上下文对象)。- 但
delete_msg是类方法,第一个参数是self,装饰器无法识别这个类方法特性,导致调用命令时参数完全错位:原本该传给self的位置被ctx占据,ctx的位置被number_of_messages(整数)填充,最终访问ctx.channel时,实际操作的是整数对象,自然触发属性不存在的错误。
修复方案
移除类方法上的@commands.command装饰器,在__init__中手动创建并绑定命令:
from discord import Intents from discord.ext import commands class GuessPrompt(commands.Bot): def __init__(self): super().__init__(command_prefix='!', intents=Intents.all()) # 手动创建命令,将实例方法绑定为回调函数 self.add_command(commands.Command( name="delete", callback=self.delete_msg, description="删除指定数量的消息" )) async def on_ready(self): print(f"{self.user.display_name} s'est bien connecté au serveur") # 无需@commands.command装饰器 async def delete_msg(self, ctx, number_of_messages: int = 1): messages = await ctx.channel.history(limit=number_of_messages + 1).flatten() for each_message in messages: await each_message.delete()
2. 不添加self.add_command(self.delete_msg)命令不被识别的原因
@commands.command装饰器的工作逻辑是:把普通函数转换成Command对象,并自动添加到已初始化的Bot实例中。- 但在类定义阶段,你的
GuessPrompt实例还未创建,装饰器无法将命令关联到后续生成的实例上。 - 因此必须在
__init__方法里,手动把类方法作为命令添加到Bot实例中,实例才能识别并响应这个命令。
如果追求更规范的代码组织,也可以使用Discord.py的Cog机制来管理命令,不过若坚持使用Bot子类的写法,上述方案即可解决问题。
内容的提问来源于stack exchange,提问作者Okarels
相关产品推荐
相关产品推荐

