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

discord.py中on_ready触发时报cached_property无id属性该怎么修复?

discord.py on_ready事件触发AttributeError报错解决

错误原因

你代码的核心问题是错误地将commands.Context类本身赋值给了ctx变量,而非使用实际的上下文实例:

  • 普通命令运行时,discord.py会自动传入包含当前触发环境(服务器、频道、发送者等)的Context实例,此时ctx.guild是真实存在的服务器对象,可以正常读取id属性
  • 你在on_ready事件中直接写ctx = commands.Context,此时ctx是类本身不是实例,类上定义的guild是被cached_property装饰的未实例化属性,没有实际服务器数据,访问id就会抛出对应错误
  • 此外on_ready本身是机器人全局启动事件,没有绑定任何特定的服务器、频道触发源,本身不存在默认的上下文对象,不需要强行构造Context使用

解决方法

根据你的使用场景选择对应方案即可:

场景1:需要给机器人已加入的所有服务器初始化nps、nastates值

直接遍历机器人的guilds属性,不需要构造Context:

@commands.Cog.listener()
async def on_ready(self):
    await self.changena()

async def changena(self):
    await self.bot.wait_until_ready()
    # 遍历所有已加入的服务器初始化配置
    for guild in self.bot.guilds:
        nps[guild.id] = None
        nastates[guild.id] = 1

场景2:只需要给指定单个服务器初始化值

直接指定目标服务器ID读取即可:

# 替换为你自己的目标服务器ID
TARGET_GUILD_ID = 123456789012345678

@commands.Cog.listener()
async def on_ready(self):
    await self.changena()

async def changena(self):
    await self.bot.wait_until_ready()
    guild = self.bot.get_guild(TARGET_GUILD_ID)
    # 增加判空,避免服务器未加载、机器人不在该服务器的异常
    if guild:
        nps[guild.id] = None
        nastates[guild.id] = 1

额外注意

  • on_ready可能会被discord.py触发多次,建议给初始化逻辑增加执行标记,避免重复覆盖已有数据
  • 如果机器人后续会加入新服务器,建议额外监听on_guild_join事件,给新加入的服务器单独初始化对应值,无需重启机器人触发on_ready

内容的提问来源于stack exchange,提问作者Ghosty366

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:39:01