开发Discord音乐机器人报AttributeError: music无setup属性如何解决
问题根因
报错AttributeError: type object 'music' has no attribute 'setup'的直接原因是:你在加载Cog时主动调用了music.setup(client),但你定义的music类本身没有setup属性,同时你也没有按照discord.py的Cog规范编写模块级的setup入口函数,解释器找不到对应方法自然抛出属性错误。
另外你贴的Cog代码里@commands.command()装饰器下没有绑定对应的命令函数,属于语法残缺,修复时需要一并补全。
修复方案
根据你使用的discord.py版本对应调整即可:
1. 补全Cog代码与setup入口
setup是discord.py加载Cog的固定入口,必须写在music类的外部、和类同级的位置,不要写在类内部。
- 如果你用的是2.0及以上版本(目前官方推荐的主流版本),setup为异步函数,参考代码:
class music(commands.Cog): def __init__(self, client): self.client = client # 补全命令逻辑,装饰器下必须紧跟异步函数定义 @commands.command() async def ping(self, ctx): await ctx.send(f"当前延迟:{round(self.client.latency*1000)}ms") # 类外部写异步setup入口 async def setup(client): await client.add_cog(music(client))
- 如果你用的是1.x老版本,setup为同步函数,参考代码:
def setup(client): client.add_cog(music(client))
2. 修正Cog加载逻辑
你原来遍历类直接调用setup的写法不符合2.0+版本的异步规范,推荐通过bot的setup_hook生命周期函数加载Cog,完整主文件参考:
import discord from discord.ext import commands # 注意2.0+版本必须开启对应意图才能响应前缀命令 intents = discord.Intents.default() intents.message_content = True client = commands.Bot(command_prefix="!", intents=intents) # 这里放上面写好的music类和setup函数 # 启动时自动加载Cog @client.event async def setup_hook(): await setup(client) # 替换为你自己的Bot Token client.run("你的Bot Token")
如果你后续把Cog拆分为独立的py文件放在cogs目录下,不需要自己遍历类调用setup,直接在setup_hook里用await client.load_extension("cogs.music")即可自动加载对应文件的Cog。
排查校验点
- 执行
pip show discord.py确认版本,不同版本的setup写法、加载逻辑不兼容,混写会触发各类报错 - 确认
setup函数没有缩进进music类内部,缩进错误会导致函数变成类的实例方法,无法被直接调用 - 确认所有
@commands.command()装饰器下都有对应的异步命令函数,空装饰器会触发语法错误
内容的提问来源于stack exchange,提问作者Leek
相关产品推荐
相关产品推荐

