pydispatch:Python中的事件驱动编程

pydispatch是一个轻量级的事件调度器,广泛应用于实现观察者模式。它允许对象之间通过事件进行通信,而无需直接引用彼此,从而实现代码的模块化和可维护性。

1.安装pydispatch

使用 pip 安装pydispatch库:

pip install pydispatch

 

2.基本概念

pydispatch库中有3个核心概念:信号(Signal)、发送者(Sender)接收者(Receiver)

  1. 信号(Signal):标识特定类型的事件,使得接收者可以区分不同的事件。
  2. 发送者(Sender):标识事件的发起者,使得接收者可以知道事件的来源。
  3. 接收者(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 就没有调用事件处理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值