如何在Discord.py重写中定义对象

时间:2020-05-18 12:49:45

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

如标题中所述,如何?我真的很难理解文档,因为没有任何示例。如何定义类似VoiceState,Member,VoiceChannel等的内容

在无需开始咨询特定文档的情况下,在教程上运行是可以的,这时如果不知道如何定义对象或使用某些命令,这会变得非常沮丧。

1 个答案:

答案 0 :(得分:3)

很多都来自经验,所以如果花一些时间来把握,不要气our!我知道这些文档可能会有些令人生畏,但我会通过举几个例子来尽力提供帮助。

制作不和谐的bot时,通常会基于参数和ctx (context)获得信息。

首先,我将从一些常规示例开始,然后介绍在使用d.py时如何使用这些示例。


参数和参数

在python中创建函数时,可以定义参数类型:

def my_func(a: int):
    return a + 5

这是假设传入my_func的args将是整数,因此也表现为int

my_func(1)

如您所料,将返回6

但是,当您尝试传递类似这样的内容时:

my_func("1")

您将得到一个TypeError,它抱怨串联str和int。此外,在列出对象的属性时,您可以看到它们之间的差异,如下所示:dir(obj)
将相同的概念应用于命令时:

@bot.command()
async def cmd(ctx, member: discord.Member):
    await ctx.send(f"Hello, {member.mention}!")

但是使用命令时,它的作用是能够根据您输入的属性(例如,成员的ID或名称)获得成员。找到的成员将具有所有discord.Member对象的属性。

这意味着您将能够访问成员的roles之类的东西,这些东西返回包含每个角色的列表作为discord.Role对象,从那里您可以获取角色的属性,等等等等。

侧注:
在d.py中获取对象的另一种方法是使用discord.utils。它需要迭代,例如列表作为第一个参数,然后再使用关键字参数,例如nameidcolourabc的任何属性来返回对象。

示例:

@bot.command()
async def getrole(ctx):
    role = discord.utils.get(ctx.author.roles, name="Very Special Role!", mentionable=True)
    await ctx.send(f"Look at you with your {role.mention} How classy!")

这将遍历每个消息发件人的角色,寻找可提及的名称(区分大小写)Very Special Role!,并将使用角色的一个属性发送消息; mention


上下文

使用命令,您要传递的第一个参数是Context,按照惯例,其表示为ctx

如链接中所示,它具有一系列属性,这些属性主要围绕命令的来源,作者以及有关命令的所有其他详细信息等。

@bot.command()
async def hello(ctx):
    await ctx.send(f"Hello, {ctx.author.name}!")

在该命令中,我正在使用coroutine上下文中的send(),该上下文用于发送消息。

在命令的 context 中,它将被发送到相同的通道,

还有一些常用的多余代码示例:

ctx.message.channel.send("some message")
ctx.message.author.send("some dm")

可以分别变成:

ctx.send("some message")
ctx.author.send("some dm")

但是您怎么知道可以在哪里send()发送消息?好吧,这使我们进入下一部分:


抽象基类

这些就是我假设您在谈论定义对象时所讲的内容。它们是对象继承的基础模板-例如,TextChannel继承了Messageable的所有属性(connectable除外,await仅由discord.VoiceChannel.channel继承。

我将以abc.Messageable为例。在链接中,它为我们提供了一些Messageable对象的示例,即您可以向其中发送消息的对象,这些对象包括TextChannelMember等对象。

有时,我看到某人错过了{{1}}或不知道何时添加他们,或者添加得太频繁。您会知道何时添加一个,因为文档将说明该函数是否是一个协程,例如:

enter image description here

这就是您知道如何处理每个对象的方法-将它们视为不和谐对象的模板,而不是您定义的对象!

如果您需要进一步说明或发现我的答案有任何错误,请告诉我。


参考: