Когда Client
получает событие от Discord, он определяет, что это за событие, и генерирует или находит объекты, которые были отправлены этим событием, например, 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 обрабатывает свои события.
Когда вы используете декоратор @client.event
на вашем on_message
, то, что вы на самом деле делаете, говорит: on_message = client.event(on_message)
Внутренний код discord.py для on_event: 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)