【问题标题】:What it really is @client.event? discord.py@client.event 到底是什么?不和谐.py
【发布时间】:2019-03-12 09:32:53
【问题描述】:

几天前,我开始对编写不和谐机器人有点兴趣。在这些程序的语法中,我注意到很多我无法找到答案的难以理解的问题。 这就是为什么我要求您帮助理解它们。

所有问题都基于此代码:

import discord
import asyncio
from discord.ext import commands

botToken = '***'

client = commands.Bot(command_prefix = '.')

@client.event
async def on_ready():
    print('Bot is ready!')

@client.event
async def on_message(message):
    author = message.author
    if message.content =='Hello':
        await client.send_message(message.channel, 'Welcome again {}!'.format(author))


client.run(botToken)

什么是@client.event?我发现这是一个事件处理程序,但它是如何工作的?为什么需要运行程序?它是否以某种方式连接到 asyncio?

【问题讨论】:

  • 您是否听说过装饰器,或者您的问题是否比这更具体?
  • 我没有听说过,我应该指出我是一个新手程序员。
  • 那么你现在有一个研究起点:)
  • 非常感谢,我已经找到了关于这些装饰器的一些东西,现在让我们学习。再次感谢。 :P

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


【解决方案1】:

Client 接收到来自 Discord 的事件时,它会计算出该事件是什么,并生成或定位由事件发送的对象,例如用于任何 MESSAGE_RECEIVE 事件的 discord.Message 或 @ 987654324@ 用于 REACTION_ADD 等
然后客户端将对象发送到处理这些事件的方法中,但您首先需要告诉客户端这些方法是什么。这就是事件装饰器的用武之地。


装饰器本质上是接受其他函数作为参数的函数。您将看到的最常见的是@property。这就是说你定义的函数应该传入property()函数

@property
def name(self):
    return self._name

一样
def name(self):
    return self._name

name = property(name)

这可能会让您感到困惑,但这就是 discord.py 处理其事件的方式。


当你在你的on_message 上使用@client.event 装饰器时,你实际上是在说on_message = client.event(on_message)

on_event的discord.py的内部代码是this

def event(self, coro):
    # Validation we don't need to worry about
    setattr(self, coro.__name__, coro)
    return coro

这意味着它将函数作为其参数,并在客户端本身上设置一个新属性。对于我们的on_message 示例,我们将on_message 函数传递给client.event(),它使客户端定义一个新的client.on_message 方法,该方法与我们的on_message 方法相同。

注意:func.__name__ 返回该函数的名称。 on_message.__name__ 将返回 "on_message"
setattr(obj, name, value) 在对象上设置属性,因此 setattr(self, "foo", 100) 意味着 self.foo 将为 100。

现在客户端知道我们的on_message,当它接收到一个表明已发送消息的事件时,它会创建discord.Message 对象并将其传递给client.on_message,正如我们已经建立的那样,它与我们自己的on_message

如果您愿意,您甚至可以跳过装饰器并在您的函数之后执行此操作,但它不如装饰器优雅:

on_message = client.event(on_message)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2021-08-23
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多