我正在构建一个 Discord 机器人。该机器人应该将一些信息存储到一些内部变量中,以便以后访问。为此,我将其构造为一个类(与许多命令在定义之外的示例相反class
)。但是,我发现当您使用@commands.command(name='test')
装饰器时,该方法会变成一种“静态”方法,并且不再将对象作为第一个输入。
鉴于此,有什么方法可以访问类属性(例如an_instance_property
下面的示例)和/或类方法(例如a_class_method
下面的示例)?
如果这是错误的方法,那么对于具有内部状态的机器人来说有什么更好的方法呢?
import discord
from discord.ext import commands
with open('TOKEN', 'r') as f:
TOKEN = f.read()
class mybot(commands.Bot):
def __init__(self):
intents = discord.Intents.default()
super().__init__(command_prefix="!", intents=intents)
self.add_command(self.test)
self.an_instance_property = [] # <----
def a_class_method(x): # <----
return x
@commands.command(name='test')
async def test(ctx, *args):
# How can I access self.an_instance_property from here?
# How can I call self.a_class_method from here?
return
bot = mybot()
bot.run(TOKEN)
我的建议是避免在机器人类中定义命令。有一种更合适的方法可以做到这一点,即使用
cogs/extensions
。请参阅此主题,其中命令在单独的文件 (extension
) 中创建,并且仅加载到机器人类中:https://stackoverflow.com/a/78166456/14307703还要注意,Context对象始终带有您的机器人的实例。因此,您可以像这样访问该类的所有属性: