【问题标题】:How to define objects in discord.py rewrite如何在 discord.py rewrite 中定义对象
【发布时间】:2020-09-04 06:34:25
【问题描述】:

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

在您必须开始查阅文档以了解特定内容之前,在教程上运行是可以的,此时当您不知道如何定义对象或使用某些命令时,它会变得非常令人沮丧...

【问题讨论】:

  • 您通常不会创建自己的模型对象。相反,您可以从其他模型对象中获取它们。例如,要使用其 id 获取 Member 对象,您可以使用 ctx.guild.get_member(id)

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


【解决方案1】:

其中很多都来自经验,所以如果需要一段时间才能掌握窍门,请不要气馁!我知道文档可能有点令人生畏,但我会尽力提供一些示例来提供帮助。

在制作不和谐机器人时,通常您会根据参数和ctx (context) 获取信息。

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


参数和参数

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

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

它的作用是假设传递给my_func 的参数是整数,因此也表现得像ints:

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}!")

在那里的命令中,我使用来自名为send() 的上下文中的coroutine,它用于发送消息。

并且在命令的上下文中,它将把它发送到同一个频道,这就是它的工作原理。

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

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 除外,它仅由 discord.VoiceChannel.channel 继承。

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

有时我看到有人错过了await,或者不知道何时添加它们,或者添加它们过于频繁。您会知道何时添加一个,因为文档会说明该函数是否为 couroutine,例如:

这就是您知道可以对每个对象做什么的方式 - 将这些视为您在不和谐中获得的对象的模板,而不是您定义的东西!

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


参考资料:

【讨论】:

  • 我非常喜欢这个,如果他们问我关于图书馆的快速入门,我会开始将人们重定向到这个评论:)
  • @LuM 噢,压力很大哈哈,但老实说,我真的很高兴你这么想,谢谢!如果您在任何时候想要添加一些内容或感觉好像我的措辞不正确/误导了,请继续更改它!再次感谢:')
猜你喜欢
  • 2019-09-21
  • 2021-02-04
  • 1970-01-01
  • 2023-03-25
  • 2021-04-28
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多