首页 > 编程语言 >pydispatch:Python中的事件驱动编程

pydispatch:Python中的事件驱动编程

时间:2024-06-10 21:28:34浏览次数:24  
标签:pydispatch added Python cart 购物车 事件驱动 item 处理器 事件

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 就没有调用事件处理器。

标签:pydispatch,added,Python,cart,购物车,事件驱动,item,处理器,事件
From: https://blog.csdn.net/kris__lee/article/details/139527952

相关文章

  • Python 潮流周刊#55:分享 9 个高质量的技术类信息源!
    大家好,我是猫哥,今天给大家分享几个高质量的技术类信息源。本文分享的信息源都是周刊类型的,所谓周刊类,就是以固定每周的频率更新,每期分享很多精华内容的链接。它的特点是信息密度极高,可以节省你去查找信息的时间,高效的学习者都会喜欢这类内容。如果不是看了这篇文章,我猜你可能想......
  • 【Python教程】4-字符串、列表、字典、元组与集合操作
    在整理自己的笔记的时候发现了当年学习python时候整理的笔记,稍微整理一下,分享出来,方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术,最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新,然后更新深度学习的一些框架,一些代码,从CV到NLP都会有相应......
  • python做后端好吗
    Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Python是一种计算机程序设计语言,既可用于前端还可用于后端开发。它是一......
  • python为什么要字符串格式化
    Python2.6开始,新增了一种格式化字符串的函数str.format(),它增强了字符串格式化的功能。相对于老版的%格式方法,它有很多优点。1.在%方法中%s只能替代字符串类型,而在format中不需要理会数据类型;2.单个参数可以多次输出,参数顺序可以不相同;3.填充方式十分灵活,对齐方式十分强......
  • Python函数编程
    ⚠申明:未经许可,禁止以任何形式转载,若要引用,请标注链接地址。全文共计3670字,阅读大概需要10分钟......
  • Python数据框操作 -- 删除数据(去除空值或者特定值)
    先创建一个数据框:importpandasaspddf=pd.DataFrame({'a':[1,1,np.nan,np.nan,4],'b':[5,6,np.nan,8,np.nan]})删除特定值存在的行数据框删去特定值所在行:df1=df.drop(df[df['a']==4].index,inplace=True) 删除存在空值的行删除有空值的所有行:df1=df.dr......
  • Python 调用 C 和 C 调用 Python 方法
    在这篇博客中,我们将探讨如何在Python中调用C函数,以及如何在C中调用Python函数。利用这两种方法,你可以在项目中充分发挥Python的简洁性和C的高性能优势。目录Python调用C函数使用ctypes使用CythonC调用Python函数使用PythonCAPIPython调用C......
  • Python统计实战:两道题掌握一个总体均值、一个总体方差、两个总体均值差、两个总体方差
    为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。(以下练习题来源于《统计学—基于Python》。联系我获取完整数据和Python代码。) 求解参数(区间)估计的基本思路一看求总体的什么参数(总体......
  • Python 编程
    开发PyCharmDocs腾讯云:Python虚拟环境(pipenv、vnev、conda)一网打尽pipxpipx官网pipx—在孤立环境中安装和运行Python应用程序安装brewinstallpipxpipxensurepath命令补全pipxcompletions#遵循该命令的指引PoetryPoetryPoetry是当下热门的Python包......
  • python入门基础知识(条件控制)
     本文内容来自菜鸟教程Python基础教程|菜鸟教程(runoob.com) 本人负责概括总结代码实现。以此达到快速复习目的。Python3条件控制Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。可以通过下图来简单了解条件语句的执行过程:......