pydispatch是一个轻量级的事件调度器,广泛应用于实现观察者模式。它允许对象之间通过事件进行通信,而无需直接引用彼此,从而实现代码的模块化和可维护性。
1.安装pydispatch
使用 pip 安装pydispatch库:
pip install pydispatch
2.基本概念
pydispatch库中有3个核心概念:信号(Signal)、发送者(Sender)和接收者(Receiver)。
- 信号(Signal):标识特定类型的事件,使得接收者可以区分不同的事件。
- 发送者(Sender):标识事件的发起者,使得接收者可以知道事件的来源。
- 接收者(Receiver):处理接收到的事件,执行相应的逻辑。
3.案例实现
下面我将通过一个简单的购物案例,来展示如何使用pydispatch实现事件驱动编程。
3.1实现简单的购物车类
在这里我将定义一个ShoppingCar类,此类包含商品添加和移除两个方法,当执行这两个方法时,将发送相应的事件调度。
from pydispatch import dispatcher
class ShoppingCart:
"""定义购物车类"""
def __init__(self):
self.items = []
# 添加商品
def add_item(self, item):
self.items.append(item)
# 发送商品添加事件,信号为'item_added',发送者为购物车实例,商品为参数item
dispatcher.send(signal='item_added', sender=self, item=item)
# 移除商品
def remove_item(self, item):
if item in self.items:
self.items.remove(item)
# 发送商品移除事件
dispatcher.send(signal='item_removed', sender=self, item=item)
3.2定义事件处理器
接着定义两个事件处理器用于处理商品添加和移除事件,这里我只做简单的消息输出。
# 定义事件处理器,接收事件并处理
def handle_item_added(sender, **kwargs):
item = kwargs.get('item')
print(f"添加商品到购物车: {item}")
def handle_item_removed(sender, **kwargs):
item = kwargs.get('item')
print(f"移除商品从购物车: {item}")
3.3注册事件处理器
使用 dispatcher.connect 方法将事件处理器注册到相应的信号上,当信号被发送时,事件处理器就会被调用。
# 注册事件处理器,将事件处理器注册到相应的信号上。这样,当信号被发送时,事件处理器会被调用。
dispatcher.connect(handle_item_added, signal='item_added')
dispatcher.connect(handle_item_removed, signal='item_removed')
3.4创建购物车实例并触发事件
创建 ShoppingCart 实例,并调用 add_item 和 remove_item 方法。当调用时会发送相应的事件,并触发注册的事件处理器。
# 创建购物车实例
cart = ShoppingCart()
# 添加和移除商品
cart.add_item('Apple')
cart.add_item('Banana')
cart.remove_item('Apple')
# 打印购物车中的商品
print(cart.items)
输出结果如下:
4.扩展知识
4.1多个事件处理器
在同一个信号注册时可以有多个事件处理器,他们会按注册的顺序依次执行。
def handle_item_added(sender, **kwargs):
item = kwargs.get('item')
print(f"添加商品到购物车: {item}")
# 第二个事件处理器
def handle_item_added_2(sender, **kwargs):
item = kwargs.get('item')
print(f"第二个处理器 - 添加商品到购物车: {item}")
# 执行顺序将按注册顺序
dispatcher.connect(handle_item_added, signal='item_added')
dispatcher.connect(handle_item_added_2, signal='item_added')
cart = ShoppingCart()
cart.add_item('Apple')
cart.add_item('Banana')
print(cart.items)
输出结果如下:
4.2指定发送者
可以指定特定的发送者,这样事件处理器就只处理来自这个特定发送者的事件。
# 注册特定购物车的事件处理器
def handle_specific_cart(sender, **kwargs):
item = kwargs.get('item')
print(f"特定购物车处理器 - 添加商品到购物车: {item}")
# 创建购物车实例
cart = ShoppingCart()
cart2 = ShoppingCart()
# 注册事件处理器,将事件处理器注册到相应的信号上。这样,当信号被发送时,事件处理器会被调用。
dispatcher.connect(handle_item_added, signal='item_added')
# 注册另一个事件处理器
dispatcher.connect(handle_item_added_2, signal='item_added')
# 注册特定购物车的事件处理器, 事件处理器只会处理指定sender的信号
dispatcher.connect(handle_specific_cart, signal='item_added', sender=cart2)
# 添加和移除商品
cart.add_item('Apple')
cart.add_item('Banana')
cart2.add_item('Orange')
print(cart.items)
输出结果如下:
4.3断开连接
通过断开事件处理器和信号的连接,事件处理器将不再接收事件。
# 创建购物车实例
cart = ShoppingCart()
# 注册事件处理器,将事件处理器注册到相应的信号上。这样,当信号被发送时,事件处理器会被调用。
dispatcher.connect(handle_item_added, signal='item_added')
# 添加和移除商品
cart.add_item('Apple')
print(cart.items)
# 断开事件处理器和信号的连接
dispatcher.disconnect(handle_item_added, signal='item_added')
cart.add_item('Pear')
print(cart.items)
输出结果如下:
可以看出在断开连接后添加 Pear 就没有调用事件处理器。
标签:pydispatch,added,Python,cart,购物车,事件驱动,item,处理器,事件 From: https://blog.csdn.net/kris__lee/article/details/139527952