python-3.x 不和谐的机器人扩展与相同的对象

insrf1ej  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(85)

我需要在多个扩展(cogs)中使用相同的对象。如何编辑我的简单bot示例来实现这一点?
我可以在我的www.example.com或cog文件中启动SHARED_OBJECTmain.py。主要是在COG1和COG2扩展中使用相同的对象。重要的是要考虑到每个扩展都可以在程序启动后重新加载。
我正在使用discord.py rewrite lib
main.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))

8ehkhllq

8ehkhllq1#

一个简单的方法是将其设置为bot上的属性。范例:

bot.my_variable = SHARED_OBJECT

字符串
您确实可以访问每个扩展中的机器人。

8zzbczxx

8zzbczxx2#

如果你的齿轮都依赖于这个共享对象,那么你应该问问自己,它们的功能是否真的足够独立,可以分成不同的模块。
也就是说,如果你编写了自己的load_extension,那么你可以编写setup方法来获取这个共享对象并将其传递给__init__类。我从实际实现中摘录了以下内容,为了简洁起见,删除了一些验证。
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))

字符串
main.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)

相关问题