到底是什么@ client.event?不和谐

时间:2018-10-07 15:19:37

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

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

所有问题均基于以下代码:

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?我发现这是一个事件处理程序,但是它如何工作?为什么需要运行程序?它以某种方式连接到异步吗?

1 个答案:

答案 0 :(得分:4)

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


从本质上讲,装饰器是将其他功能作为参数的功能。您会看到的最常见的是@property。这表示您定义的函数应该传递到property()函数

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

相同
def name(self):
    return self._name

name = property(name)

这可能会使您困惑不解,但这就是discord.py处理事件的方式。


@client.event上使用on_message装饰器时,实际上是在说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)