写一个小型的事件派遣系统模块
时间: 2023-08-10 15:05:18 浏览: 36
好的,下面是一个简单的事件派遣系统模块的实现:
```python
class EventDispatcher:
def __init__(self):
self.listeners = {}
def add_listener(self, event_type, listener):
if event_type not in self.listeners:
self.listeners[event_type] = []
self.listeners[event_type].append(listener)
def remove_listener(self, event_type, listener):
if event_type in self.listeners:
listeners = self.listeners[event_type]
if listener in listeners:
listeners.remove(listener)
if len(listeners) == 0:
del self.listeners[event_type]
def dispatch_event(self, event_type, event_data=None):
if event_type in self.listeners:
listeners = self.listeners[event_type]
for listener in listeners:
listener(event_type, event_data)
```
这个模块实现了一个 `EventDispatcher` 类,它可以通过 `add_listener` 方法添加监听器,通过 `remove_listener` 方法移除监听器,通过 `dispatch_event` 方法触发事件并通知所有监听器。
使用方法如下:
```python
# 创建事件派发器
dispatcher = EventDispatcher()
# 定义一些事件类型
EVENT_TYPE_A = "EVENT_TYPE_A"
EVENT_TYPE_B = "EVENT_TYPE_B"
# 定义一些监听器函数
def listener_a(event_type, event_data):
print("Listener A received event:", event_type, event_data)
def listener_b(event_type, event_data):
print("Listener B received event:", event_type, event_data)
# 添加监听器
dispatcher.add_listener(EVENT_TYPE_A, listener_a)
dispatcher.add_listener(EVENT_TYPE_B, listener_b)
dispatcher.add_listener(EVENT_TYPE_A, listener_b)
# 触发事件
dispatcher.dispatch_event(EVENT_TYPE_A, {"message": "Hello world!"})
dispatcher.dispatch_event(EVENT_TYPE_B, {"number": 42})
# 移除监听器
dispatcher.remove_listener(EVENT_TYPE_A, listener_a)
dispatcher.remove_listener(EVENT_TYPE_B, listener_b)
# 再次触发事件
dispatcher.dispatch_event(EVENT_TYPE_A, {"message": "Goodbye world!"})
dispatcher.dispatch_event(EVENT_TYPE_B, {"number": 100})
```
输出结果如下:
```
Listener A received event: EVENT_TYPE_A {'message': 'Hello world!'}
Listener B received event: EVENT_TYPE_A {'message': 'Hello world!'}
Listener B received event: EVENT_TYPE_B {'number': 42}
Listener A received event: EVENT_TYPE_B {'number': 42}
```