Python中如何从Cog类访问Bot类的实例变量self.tracker
解决方法
你需要通过self.bot.tracker访问主Bot类中的tracker变量,问题通常出在类型注解或导入环节,具体修正步骤如下:
1. 导入GiftBot类并修正类型注解
在cogs/invite_module.py中导入你的GiftBot类,同时将Cog初始化方法的参数类型从commands.Bot改为GiftBot,这样既能消除IDE的类型提示错误,也能确保运行时正确识别属性:
# cogs/invite_module.py from gift_bot import GiftBot import discord from discord.ext import commands # 导入你的get_inviter函数 class InviteModule(commands.Cog): def __init__(self, bot: GiftBot): self.bot = bot self.last_member: list = [] @commands.Cog.listener("on_member_join") async def on_member_join(self, member: discord.Member): # 正确访问tracker变量 invite_info = await get_inviter(self.bot.tracker, member)
2. 确保Cog加载时机正确
必须在创建GiftBot实例之后再加载Cog,避免因Bot未完成初始化导致属性无法访问。比如在主入口文件中:
# gift_bot.py 或独立的main.py if __name__ == "__main__": bot = GiftBot() # 加载Cog bot.load_extension("cogs.invite_module") bot.run("你的Bot令牌")
问题原因说明
- 直接写
tracker无效:当前Cog实例本身没有tracker属性,必须通过关联的Bot实例访问。 - 之前用
self.bot.tracker可能报错的原因:- 类型注解用了基类
commands.Bot,IDE会提示属性不存在,但实际运行时如果Bot实例是GiftBot类型,本应能访问; - 如果运行时报
AttributeError,大概率是加载Cog时Bot还未完成初始化,或者未正确导入GiftBot导致类型不匹配。
- 类型注解用了基类
另外你在GiftBot中先初始化self.tracker再调用super().__init__的顺序是合理的,因为InviteTracker只需要Bot实例对象本身,此时实例已经创建完成。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

