簡體   English   中英

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

[英]What it really is @client.event? 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? 我發現這是一個事件處理程序,但是它如何工作? 為什么需要運行程序? 它以某種方式連接到異步嗎?

Client接收從不和諧的事件,它的工作原理什么是事件和產生,或定位,這是由事件發送的對象,如discord.Message任何MESSAGE_RECEIVE事件,或discord.Reaction為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的內部代碼是這樣的

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM