discord.py二次调用指令报Test2无user属性AttributeError原因求解
错误原因解析
你遇到的报错核心原因就是手动调用__init__方法时的传参逻辑错误:
- 类的实例方法(包括构造方法
__init__)通过实例调用时,第一个self参数是Python自动传入的,不需要手动传递 - 你的
Test2.__init__方法定义了两个参数:第一个是自动传入的实例自身self,第二个是需要手动传入的bot实例dc_bot - 你写的
self.__init__(self)这行代码,相当于把当前的Test2实例对象当成dc_bot参数赋值给了self.bot,直接覆盖了原本正确的bot实例 - 第二次调用指令时,
self.bot已经变成了Test2实例本身,而Test2类没有定义user属性,访问self.bot.user时就会抛出对应的AttributeError
正确重置属性的方案
如果需要重置多个实例属性,不推荐直接调用__init__,更建议单独封装重置逻辑,避免意外覆盖不需要修改的属性:
class Test2(commands.Cog): def __init__(self, dc_bot): self.bot = dc_bot self.reset_attrs() # 初始化时调用重置方法赋初始值 # 单独封装所有需要重置的属性逻辑 def reset_attrs(self): self.ui = "" # 其他需要初始化的属性都可以放在这里 @commands.command(description="get avatar") async def getavatar(self, ctx, *, content: str): avatar = self.bot.user.avatar_url self.ui += content await ctx.send(content) await ctx.send(avatar) self.reset_attrs() # 调用重置方法,不会影响self.bot等不需要修改的属性
如果一定要复用__init__的逻辑,调用时传入正确的bot实例即可,即修改为self.__init__(self.bot),但该写法容易出现属性意外覆盖的问题,不推荐使用。
内容的提问来源于stack exchange,提问作者TimG233
相关产品推荐
相关产品推荐

