具有相同对象的不一致bot扩展

2024-10-03 09:10:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在多个扩展(COG)中使用同一个对象。如何编辑我的简单bot示例来实现这一点?你知道吗

我可以在我的主.py或者也在cog文件中。要点是在COG1和COG2扩展中使用相同的对象。重要的是要考虑到每个扩展都可以在程序启动后重新加载。你知道吗

我正在使用discord.py rewritelib

你知道吗主.py你知道吗

client = Bot(description="Bot", command_prefix="!")
client.run(__token__)    
SHARED_OBJECT = SomeObject()


@client.event
async def on_ready():
    client.dev = True
    print('[Discord] Logged in as {} (ID:{}) | Connected to {}  servers'.format(client.user.name,client.user.id,1))

    client.load_extension('COG1')
    client.load_extension('COG2')

COG1.PY类

class COG1():
    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def test(self):
    print()

def setup(bot):
    bot.add_cog(COG1(bot))

COG1.PY类

class COG2():
    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def test(self):
    print("test")

def setup(bot):
    bot.add_cog(COG2(bot))

Tags: 对象pytestselfclientasyncdefbot
1条回答
网友
1楼 · 发布于 2024-10-03 09:10:29

如果您的COG都依赖于这个共享对象,那么您应该扪心自问,它们的功能是否真的足够独立,可以拆分为不同的模块。你知道吗

也就是说,如果您编写自己的load_extension,那么您可以编写setup方法来获取这个共享对象并将其传递给类__init__。为了简洁起见,我将下面的内容从actual implementation中删除了一些验证。你知道吗

cog1.py:(与cog2的更改相同)

class COG1():
    def __init__(self, bot, sharedobj):
        self.bot = bot
        self.sharedobj = sharedobj

    @commands.command()
    async def test(self):
        print()

def setup(bot, sharedobj):
    bot.add_cog(COG1(bot, sharedobj))

你知道吗主.py你知道吗

import importlib

def load_extension(name, bot, sharedobj):
    if name in self.extensions:
        return
    lib = importlib.import_module(name)
    lib.setup(bot, sharedobj)
    bot.extensions[name] = lib

SHARED_OBJECT = SomeObject()

load_extension('COG1', SHARED_OBJECT)
load_extension('COG2', SHARED_OBJECT)

相关问题 更多 >