You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:36:14