[英]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.