Python 实现支持多监听器与取消注册的发布 - 订阅模式
下面是一个简单的发布-订阅模式的实现,包括 `EventEmitter` 类和 `Listener` 类。`EventEmitter` 类负责管理事件和监听器,而 `Listener` 类则提供处理事件的方法。 ```python class Listener: def __init__(self, name): self.name = name def handle(self, event_data): print(f"Listener {self.name} received event with data: {event_data}") class EventEmitter: def __init__(self): self.listeners = {} def on(self, event, listener): if event not in self.listeners: self.listeners[event] = [] self.listeners[event].append(listener) def emit(self, event, data=None): if event in self.listeners: for listener in self.listeners[event]: listener.handle(data) def remove_listener(self, event, listener): if event in self.listeners: self.listeners[event] = [l for l in self.listeners[event] if l != listener] if not self.listeners[event]: del self.listeners[event] # 示例用法 if __name__ == "__main__": # 创建事件发射器 emitter = EventEmitter() # 创建监听器 listener1 = Listener("1") listener2 = Listener("2") listener3 = Listener("3") # 注册监听器 emitter.on("event1", listener1) emitter.on("event1", listener2) emitter.on("event2", listener3) # 触发事件 emitter.emit("event1", "data for event1") emitter.emit("event2", "data for event2") # 取消注册特定的监听器 emitter.remove_listener("event1", listener1) # 再次触发事件 emitter.emit("event1", "data for event1 after removal") ``` 解释 1. Listener 类: - `__init__` 方法初始化监听器的名称。 - `handle` 方法在事件被触发时调用,打印接收到的事件数据。 2. EventEmitter 类: - `__init__` 方法初始化一个字典来存储事件和对应的监听器列表。 - `on` 方法用于注册监听器。如果事件不存在,则创建一个新的列表来存储监听器。 - `emit` 方法用于触发事件。如果事件存在,则遍历该事件的所有监听器并调用它们的 `handle` 方法。 - `remove_listener` 方法用于取消注册特定的监听器。如果事件存在且监听器在列表中,则从列表中移除该监听器。如果移除后列表为空,则删除该事件的条目。 示例用法 - 创建一个 `EventEmitter` 实例。 - 创建三个 `Listener` 实例。 - 注册监听器到不同的事件。 - 触发事件,观察输出。 - 取消注册特定的监听器。 - 再次触发事件,观察输出的变化。 这个实现满足了发布-订阅模式的基本要求,可以注册多个监听同一事件的监听器,并且支持取消注册特定的监听器。 ######[AI写代码神器 | 661点数解答 | 2024-11-12 09:16:25]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)498
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)384
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)451
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)443
- Flutter 3.22 发布!更新内容大揭秘,附计数器代码示例(讯飞星火 | 471点数解答 | 2024-05-20 11:30:28)207
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)352
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)421
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)445
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)552
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)418
- Java JFrame 实现多界面跳转:含登录、注册及个人信息管理功能(讯飞星火 | 503点数解答 | 2024-06-06 23:49:29)417
- 超详细!用复杂 HTML 代码打造功能丰富网站,含特色搜索与展示(字节豆包 | 572点数解答 | 2024-11-17 07:58:26)276