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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:23:12