我需要在多个扩展名(齿轮)中使用同一对象。如何编辑我的简单机器人示例来实现这一目标?
我可以在main.py或cog文件中启动SHARED_OBJECT。要点是在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))
最佳答案
如果您的齿轮都依赖于此共享对象,那么您应该问问自己,它们的功能是否真的足够独立,可以分为不同的模块。
就是说,如果您编写自己的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))
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)