Python实现类似于Qt的信号、槽

使用Python实现一个类似Qt的信号、槽函数的class


class Signal:def __init__(self, *arg_types):self.__subscribers = []self.__arg_types = arg_typesdef connect(self, func):self.__subscribers.append(func)def disconnect(self, func):try:self.__subscribers.remove(func)except ValueError:print("Warning: function not found in the list of subscribers.")def emit(self, *args):# 检查传入参数的类型if len(args) != len(self.__arg_types):raise ValueError("Argument count mismatch")for arg, arg_type in zip(args, self.__arg_types):if not isinstance(arg, arg_type):raise TypeError(f"Argument {arg} does not match {arg_type}")# 如果所有检查都通过,则调用每个订阅者for subscriber in self.__subscribers:subscriber(*args)# 示例使用
if __name__ == "__main__":# 创建一个信号,指定它将发射一个str类型和一个int类型的数据signal = Signal(str, int)# 定义一个槽函数,接收一个str和一个intdef slot(message, number):print(f"Received message: {message}, number: {number}")# 连接信号到槽函数signal.connect(slot)# 正确使用,符合类型要求signal.emit("Test", 42)# 尝试发射错误的类型,将引发TypeErrortry:signal.emit("Another Test", "not a number")except TypeError as e:print(f"TypeError: {e}")

这段代码实现了一个简单的信号-槽(Signal-Slot)机制,类似于Qt框架中的信号与槽。某个事件发生(信号)时通知一个或多个接收者(槽)进行响应:

  1. Signal类初始化 (__init__ 方法):

    • 当一个Signal对象被创建时,它可以接受任意数量的参数类型作为其构造函数的参数。这些参数类型将存储在self.__arg_types中,用来校验发射信号时传递的参数类型是否正确。
    • self.__subscribers 是一个列表,用来存储所有连接到这个信号的函数(订阅者)。
  2. connect 方法:

    • 该方法接受一个函数(func)作为参数,并将这个函数添加到self.__subscribers列表中。每当信号发射时,这个函数将被调用。
  3. disconnect 方法:

    • 该方法用于移除一个已连接的函数。如果该函数存在于self.__subscribers列表中,它将被移除。如果函数不存在,则打印一条警告信息。
  4. emit 方法:

    • 这是信号发射的核心方法。它接受任意数量的参数,这些参数将被传递给所有连接到该信号的函数。
    • 在传递参数给订阅者之前,emit方法首先校验参数的数量是否与初始化信号时指定的类型数量一致;接着校验每个参数的类型是否与相应的self.__arg_types中指定的类型匹配。如果参数的数量或类型不匹配,则抛出异常。
    • 一旦检查通过,emit方法将遍历self.__subscribers列表,并依次调用其中的每个函数,将信号的参数传递给这些函数。

在使用时,引入这个类即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

⑥ - 后端工程师通识指南

📖 该文隶属 程序员:职场关键角色通识宝典✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝典🏅

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y,解释变量记为x1,x2,… 因变量y一般…

第三节课,功能2:开发后端用户的管理接口-- postman--debug测试

一、如何使用postman 网址: https://www.postman.com/downloads/ 【Postman小白教程】五分钟学会如何使用Postman~_哔哩哔哩_bilibili postman安装使用_bowser agent在postman哪里-CSDN博客 二、下载后 登录,开始测试 2.1 关于postman 报错&#…

MTEB - Embedding 模型排行榜

文章目录 关于 MTEBMTEB 任务和数据集概览使用 MTEB Pythont 库Installation使用 关于 MTEB MTEB : Massive Text Embedding Benchmark github : https://github.com/embeddings-benchmark/mtebhuggingface : https://huggingface.co/spaces/mteb/leaderboardpaper : https:/…

【Java EE】CAS原理和实现以及JUC中常见的类的使用

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

asyncionetworkxFuncAnimation学习--动态显示计算图的运行情况

asyncio&networkx&FuncAnimation学习--动态显示计算图的运行情况 一.效果二.代码 一.目的 1.动态显示计算图的运行状态(点或边是否已完成) 二.步骤: 1.定义计算图 2.asyncio 并行计算 3.networkx 显示计算图 4.FuncAnimation 动态更新 三.依赖: conda install pygraphv…

数据结构--栈与队列【您的关注是我创作的动力!】

文章目录 栈什么是栈?栈的具体实现 队列什么是队列?队列的实现 栈 什么是栈? 栈也是顺序表的一种,栈的逻辑实现是先进后出(后进先出)就跟子弹夹一样。 具体逻辑就是它只允许在固定的一端进行数据的插入与…

PHP源码_最新Ai对话系统网站源码 ChatGPT+搭建教程+前后端

基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论…

【KTips】在Kotlin中实现一个十分简单的自循环状态机

在平日的编码生活中,你有没有遇到过需要通过状态机来实现的逻辑呢?一个状态的轮转、事件订阅的通讯处理等。 状态机的实现方式千变万化,这里我会为你介绍一个简单的自循环状态机实现。 简单介绍 在开始之前,我先说明一下这个所谓…

C# Web控件与数据感应之 CheckBoxList 类

目录 关于数据感应 CheckBoxList 类 范例运行环境 数据源表设计 角色字典表 用户角色表 AutoValueDBList 方法 原理 设计 实现 调用示例 初始化数据 启动查询模式 使用保存模式 小结 关于数据感应 数据感应也即数据捆绑,是一种动态的,We…

PostgreSQL的扩展pgpool

PostgreSQL的扩展pgpool pgpool-II(通常简称为 pgpool)是一个流行的 PostgreSQL 中间件,广泛用于连接池、负载均衡、自动故障转移等场景。作为一种高级数据库解决方案,pgpool 能够在多个 PostgreSQL 服务器之间分配数据库查询&am…

base64解码时报错“decode base64: invalid input“

现象 用base64 -d 去还原base64编码后的文件时报错decode base64: invalid input 例如: $ base64 test.zip | base64 -d > test2.zip base64: invalid input $ ll test* -rw-r--r-- 1 user grp 152 19 11:41 test.zip -rw-r--r-- 1 user grp 57 19 11:42 test2.zip解决办…

【Docker学习】docker version查看版本信息

就像很多应用一样,docker也使用version来查看版本信息。但因为docker包含有不少独立组件,version的作用范围会更广一些。 用法1: docker --version 描述: 输出安装的Docker CLI 的版本号。关于Docker CLI,请访问。 实操…

项目管理-项目范围管理2/2

项目管理:每天进步一点点~ 活到老,学到老 ヾ(◍∇◍)ノ゙ 何时学习都不晚,加油 项目范围管理,过程 6个,包括“规收定 创确控”: 规划范围管理收集需求定义范围创建WBS确认范围控制…

【YOLOv8报错】ModuleNotFoundError: No module named ‘lap‘

文章目录 【问题描述】【解决方式】【参考链接】 【问题描述】 使用YOLOv8进行追踪运行代码时报错:ModuleNotFoundError: No module named lap 【解决方式】 执行以下命令 pip install lapx【参考链接】 https://github.com/ultralytics/ultralytics/issues/177…

怎么证明E[E(X|Y,Z)Y]= E(X|Y)

性质8的证明 物理意义

Python词频统计

在Python中进行词频统计是一项基础的文本分析任务,通常涉及以下步骤: 文本预处理:包括去除标点符号、转换为小写、去除停用词等。分词:将文本分割成单词或词汇。统计词频:对分词后的结果进行计数。 以下是一个简单的…

webpack基础---常用loader

webpack 命令式和配置文件 html-webpack-plugin 配置项:{ templete: filename: inject: } 清除上次打包的文件,output: { clear: true } mode选项: none development prodution souce-map:可以精准定位代码行数 { devt…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

发卡授权盗u系统源码ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c; 搭建系统TGaqxm01&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.s…