如何实现Discord.py风格的@xxx.event装饰器与异步事件处理类?
事件驱动装饰器机制实现(Discord.py风格)
这种机制叫做事件订阅/注册机制,属于事件驱动架构的一部分——核心是用装饰器把异步函数绑定到对应事件名上,当事件触发时自动执行所有绑定的处理函数。
1. 核心类实现
先构建一个类似Discord.py Client的核心类,内部维护事件注册表,用来存储事件名和对应的异步处理函数列表:
import asyncio from typing import Callable, Coroutine, Dict, List class SocialPlatformClient: def __init__(self): # 事件注册表:键是事件名称,值是对应处理函数的列表 self._events: Dict[str, List[Callable[..., Coroutine]]] = {} def event(self, event_name: str = None): """事件装饰器:用来注册异步事件处理函数""" def decorator(func: Callable[..., Coroutine]) -> Callable[..., Coroutine]: # 没指定事件名的话,直接用函数名当事件名(比如on_post_comment) target_name = event_name or func.__name__ # 事件不存在就初始化空列表 if target_name not in self._events: self._events[target_name] = [] # 把处理函数添加到对应事件的列表里 self._events[target_name].append(func) return func return decorator async def trigger_event(self, event_name: str, *args, **kwargs): """触发指定事件,执行所有绑定的处理函数""" if event_name not in self._events: return # 遍历所有绑定的异步函数,逐个执行 for handler in self._events[event_name]: await handler(*args, **kwargs)
2. 实际使用示例
完全贴合你给出的代码风格:
# 创建客户端实例 client = SocialPlatformClient() # 注册事件处理函数 @client.event() async def on_post_comment(comment): print(f"收到新评论:{comment}") @client.event() async def on_comment_reply(comment, reply): print(f"评论[{comment}]收到回复:{reply}") @client.event() async def on_post_liked(user): print(f"用户{user}点赞了帖子") # 模拟网站动作触发事件(实际场景中可对接webhook、数据库回调等) async def simulate_site_actions(): await client.trigger_event("on_post_comment", "这是一条测试评论") await client.trigger_event("on_comment_reply", "原评论内容", "这是一条回复") await client.trigger_event("on_post_liked", "小明") # 运行模拟逻辑 asyncio.run(simulate_site_actions())
3. 扩展说明
- 自定义事件名:如果不想用函数名当事件名,可直接给装饰器传参,比如
@client.event("new_user_comment"),触发时用trigger_event("new_user_comment", ...) - 异步特性:所有事件处理函数都是异步的,触发时必须用
await,确保所有逻辑执行完成 - 场景适配:在实际网站中,你可以把
trigger_event和网站的动作绑定——比如收到评论的webhook请求时,调用await client.trigger_event("on_post_comment", 评论数据)
内容的提问来源于stack exchange,提问作者Walker
相关产品推荐
相关产品推荐

