【问题标题】:retrieve variables from cog class从 cog 类中检索变量
【发布时间】:2021-06-15 08:41:39
【问题描述】:
class Music(commands.Cog):
    def __init__(self, client):
        self.players = {}

    async def destroy_player(self,ctx):
        try:
            self.players.pop(ctx.guild.id)
            print(self.players)
        except:
            pass


def setup(client):
    client.add_cog(Music(client))

这是我的代码的一部分。如何在课堂外使用 self.players?

【问题讨论】:

    标签: python python-3.x discord discord.py


    【解决方案1】:

    简单,使用get_cog 方法。假设您在另一个 cog 中使用它

    
    async def get_something(self, ctx): #this would be a cog method (command or any function inside a cog class)
       Music = self.bot.get_cog('Music')
       print(Music.players)
    

    或者如果你只是使用bot

    async def get_something(ctx):
       Music = bot.get_cog('Music') #or ctx.bot.get_cog('Music')
    

    如果您添加了 cog Musicadd_cog(Music(bot),这将起作用

    参考资料:

    示例:

    您可以查看 discord.py 的文档示例 here

    【讨论】:

    • 谢谢!这对我有帮助,但我不知道为什么,但不得不使用 ctx 而不是 self: Music = ctx.bot.get_cog('Music') 但它仍然有帮助!
    • 是的,self 仅在您处于 cog 时才有效。我将编辑我的答案以使其在主要工作
    【解决方案2】:

    您可以创建一个类的实例(在函数外部创建实例以在函数外部使用它,或者在带有 return 语句的函数中使用它)这是一种更简单的方法

    或者,如果您想避免创建类的实例,请这样做:

    class Music:
        players = {}
    
        @classmethod
        def get_players(self): 
            return self.players
    
    Music.get_players()
    

    这也将返回属性而不创建类实例,但属性可以在 init 语句中。

    如果您想了解更多关于 Python 中的 getter 和 setter 的信息

    【讨论】:

    • 这只会返回一个新对象,不会使用 cog 的数据,只会打印空玩家
    【解决方案3】:

    你可以在使用之前定义一个变量来存储类对象,像这样:

    def setup(client):
        c = Music(client)
        client.add_cog(c)
        print(c.players)
    

    【讨论】:

    • 我如何在函数外使用'c'?
    • 因为 'c.players' 是一个类,我想销毁它。为此我需要'c',否则我需要一种方法来自行杀死班级。
    • @AlpacaTheUnicorn 您可以在函数末尾添加return c,当您调用函数时,您可以添加c = setup(),而不是setup()
    • setup 由load_extension 调用,如果我没记错的话。我不认为 OP 手动调用它。
    • @Ceres 哦。感谢您通知我。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多