基于深度学习的视觉检测小项目(四) pyside6和python一些常用的修饰器和属性、工具的基础知识

        在 PySide6有一些常用的装饰器和工具,用于增强代码的功能和可读性。以下是一些常见的装饰器及其用法:


1. @staticmethod

@staticmethod 是 Python 内置的装饰器,用于声明静态方法。静态方法不需要访问类实例或类本身,可以直接通过类名调用。

示例:
class MyClass:@staticmethoddef my_static_method():print("This is a static method")# 调用静态方法
MyClass.my_static_method()


2. @classmethod

@classmethod 是 Python 内置的装饰器,用于声明类方法。类方法的第一个参数是类本身(通常命名为 cls),而不是实例。

示例:
class MyClass:@classmethoddef my_class_method(cls):print(f"This is a class method of {cls.__name__}")# 调用类方法
MyClass.my_class_method()


3. @property

@property 是 Python 内置的装饰器,用于将方法转换为属性。通过 @property,你可以像访问属性一样访问方法,而不需要显式调用方法。

示例:
class MyClass:def __init__(self):self._value = 10@propertydef value(self):return self._value@value.setterdef value(self, new_value):self._value = new_value# 使用属性
obj = MyClass()
print(obj.value)  # 访问属性
obj.value = 20    # 设置属性


4. @functools.lru_cache

@functools.lru_cache 是 Python 标准库 functools 中的装饰器,用于缓存函数的返回值,避免重复计算。

示例:
import functools@functools.lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n - 1) + fibonacci(n - 2)# 调用函数
print(fibonacci(10))  # 结果会被缓存


5. Signal

        在 PySide6 中,PySide6.QtCore.Signal 用于声明自定义信号。信号是 Qt 框架中用于对象间通信的机制。

示例:
from PySide6.QtCore import QObject, Signalclass MyObject(QObject):my_signal = Signal(int)  # 声明一个带 int 参数的信号def trigger_signal(self):self.my_signal.emit(42)  # 发射信号# 使用信号
obj = MyObject()
obj.my_signal.connect(lambda value: print(f"Signal received: {value}"))
obj.trigger_signal()


6. @PySide6.QtCore.Property

@PySide6.QtCore.Property 是 PySide6 中的装饰器,用于声明 Qt 属性。Qt 属性可以在 QML 或 Qt Designer 中使用。

示例:
from PySide6.QtCore import QObject, Propertyclass MyObject(QObject):def __init__(self):super().__init__()self._value = 10@Property(int)  # 声明一个 int 类型的 Qt 属性def value(self):return self._value@value.setterdef value(self, new_value):self._value = new_value# 使用 Qt 属性
obj = MyObject()
print(obj.value)  # 访问属性
obj.value = 20    # 设置属性


7. @contextlib.contextmanager

@contextlib.contextmanager 是 Python 标准库 contextlib 中的装饰器,用于创建上下文管理器。上下文管理器通常用于资源管理(如文件操作、数据库连接等)。

示例:
from contextlib import contextmanager@contextmanager
def open_file(file_name, mode):file = open(file_name, mode)try:yield filefinally:file.close()# 使用上下文管理器
with open_file("test.txt", "w") as f:f.write("Hello, World!")


8. @dataclasses.dataclass

@dataclasses.dataclass 是 Python 标准库 dataclasses 中的装饰器,用于自动生成类的 __init____repr__ 等方法,简化类的定义。

示例:
from dataclasses import dataclass@dataclass
class Point:x: inty: int# 使用数据类
p = Point(10, 20)
print(p)  # 输出: Point(x=10, y=20)


9. @typing.overload

@typing.overload 是 Python 标准库 typing 中的装饰器,用于声明函数的重载。它可以帮助静态类型检查工具(如 mypy)理解函数的不同调用方式。

示例:
from typing import overload@overload
def process(value: int) -> int: ...
@overload
def process(value: str) -> str: ...def process(value):if isinstance(value, int):return value * 2elif isinstance(value, str):return value.upper()# 调用函数
print(process(10))  # 输出: 20
print(process("hello"))  # 输出: HELLO

10. @unittest.mock.patch

@unittest.mock.patch 是 Python 标准库 unittest.mock 中的装饰器,用于在单元测试中模拟对象或函数的行为。

示例:
from unittest.mock import patchdef my_function():return 42@patch("__main__.my_function", return_value=100)
def test_my_function(mock_function):assert my_function() == 100# 运行测试
test_my_function()

 11. @flag

@flag用于定义一个标志类型。标志类型可以用于表示多个选项的组合。

示例:
from PySide6.QtCore import Flag@Flag
class MyFlags:Flag1 = 0x1Flag2 = 0x2Flag3 = 0x4

  12. @Enum

@Enum用于定义一个枚举类型。枚举类型在处理有限的选择集合时非常有用。

示例:
from PySide6.QtCore import Enum@Enum
class MyEnum:Option1 = 0Option2 = 1Option3 = 2

 13. QMetaObject.connectSlotsByName()

QMetaObject.connectSlotsByName() 是 Qt 框架中的一个函数,用于自动将某个对象的信号和槽通过名称匹配的方式连接起来。这个函数通常在自定义的 QObject 子类中使用,特别是在实现自定义的 UI 控件或组件时,可以简化信号和槽的连接过程。

示例:
class MyWidget(QWidget):def __init__(self):super().__init__()# 设置UIself.setupUi()# 自动连接信号和槽QMetaObject.connectSlotsByName(self)def setupUi(self):# 创建一个按钮,并设置对象名self.button = QPushButton("Click me", self)self.button.setObjectName("button")@pyqtSlot()def on_button_clicked(self):print("Button clicked!")

命名规则:
connectSlotsByName() 会根据槽函数的命名规则来匹配信号和槽。槽函数的命名规则如下:

槽函数名称: on_<objectName>_<signalName>
        objectName: 对象的名称,通常通过 setObjectName() 设置。
        signalName: 信号的名称,通常是信号的函数名去掉参数部分。
例如,如果有一个名为 button 的按钮对象,并且希望在按钮被点击时触发某个操作,可以定义一个槽函数名为 on_button_clicked。这样,connectSlotsByName() 会自动将 button 的 clicked 信号连接到这个槽函数。

需要知道的是:使用pyuic转换而来的.py文件代码中,QMetaObject.connectSlotsByName()命令已经被自动添加了,所以只需要根据槽函数的命名规则进行命名使用即可。


 

总结

装饰器用途
@staticmethod声明静态方法,无需访问实例或类。
@classmethod声明类方法,第一个参数是类本身。
@property将方法转换为属性,支持 getter 和 setter。
@functools.lru_cache缓存函数返回值,避免重复计算。
@PySide6.QtCore.Signal声明自定义信号,用于对象间通信。
@PySide6.QtCore.Property声明 Qt 属性,支持在 QML 或 Qt Designer 中使用。
@contextlib.contextmanager创建上下文管理器,用于资源管理。
@dataclasses.dataclass自动生成类的 __init____repr__ 等方法,简化类定义。
@typing.overload声明函数重载,帮助静态类型检查工具理解函数的不同调用方式。
@unittest.mock.patch在单元测试中模拟对象或函数的行为。
@flag定义一个标志类型。
@Enum定义一个枚举类型。
connectSlotsByName()将对象的信号和槽通过名称匹配的方式连接起来

这些装饰器在 Python 和 PySide6 开发中非常有用,可以帮助你编写更简洁、高效和可维护的代码。根据具体需求选择合适的装饰器,可以显著提升开发效率。

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

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

相关文章

SQL 中的 EXISTS

我们先从 SQL 中最基础的 WHERE 子句开始。 比如下面这条 SQL 语句&#xff1a; 很显然&#xff0c;在执行这条 SQL 语句的时候&#xff0c;DBMS 会扫描 Student 表中的每一条记录&#xff0c;然后把符合 Sdept IS 这个条件的所有记录筛选出来&#xff0c;并放到结果集里面去…

C语言链表通关文牒0.5

之前排序创建链表那里用的是哨兵法&#xff0c;但是有局限性&#xff0c;这里介绍一个补充&#xff0c;不创建第一个空节点进行排序 NODE *create() {int val;NODE *head NULL; // 初始化头指针为NULLNODE *pC NULL; // 初始化指针&#xff0c;用于遍历链表while(1) {pri…

GAN对抗生成网络(一)——基本原理及数学推导

1 背景 GAN(Generative Adversarial Networks)对抗生成网络是一个很巧妙的模型&#xff0c;它可以用于文字、图像或视频的生成。 例如&#xff0c;以下就是GAN所生成的人脸图像。 2 算法思想 假如你是《古董局中局》的文物造假者&#xff08;Generator,生成器&#xff09;&a…

基于Python的携程旅游景点数据分析与可视化

基于Python的携程旅游景点数据分析与可视化 爬取景点、价格、开放状态、评论、热度、优惠政策等信息。 功能列表 指定城市爬取支持登录支持筛选支持评论爬取支持数据存在数据库支持生成Excel支持可视化 部分效果演示 爬取的旅游景点信息 生成Excel 指定城市爬取 可视化 部门…

SQL-leetcode-197. 上升的温度

197. 上升的温度 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。 该表包…

等待事件 ‘latch: row cache objects‘ 说明及解决方法

早上刚来的时候&#xff0c;收到zabbix 数据库连接数增长的告警&#xff0c;同时应用负责人也说查询很慢、很卡 查看该时间段 最多的等待事件 SELECT event,COUNT(1) num FROM V$ACTIVE_SESSION_HISTORY A WHERE A.SAMPLE_TIME BETWEEN TO_DATE(2025-01-02 09:00:00, YYYY-M…

HAL 库------中断相关函数

HAL_SuspendTick();是对SysTick中CTRL寄存器中TICKINT位清0 HAL_ResumeTick(); 刚好与上面函数相反&#xff0c;对SysTick中CTRL寄存器中TICKINT位置1&#xff0c;恢复stick中断。

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示&#xff1a; 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范&#xff0c;可以帮忙本地自动扫描出不符合开发者规范的代码&#xff0c;甚至是代码漏洞提示。 右击项目&#xff0c;选择《编码规约扫描》&#xff0c;可以进行本地代码规范扫…

QT-------------多线程

实现思路 QThread 类简介&#xff1a; QThread 是 Qt 中用于多线程编程的基础类。可以通过继承 QThread 并重写 run() 方法来创建自定义的线程逻辑。新线程的执行从 run() 开始&#xff0c;调用 start() 方法启动线程。 掷骰子的多线程应用程序&#xff1a; 创建一个 DiceThre…

在C语言基础上的C++(深入理解类和对象)

1&#xff1a;构造函数 1&#xff1a;为什么使用构造函数 由于类的封装性&#xff0c;一般来说&#xff0c;数据成员是不能被外界访问的&#xff0c;所以对象的数据成员的初始化工作就给共有函数来完成了。如果定义了构造函数&#xff0c;那么只要对象一建立&#xff0c;就可…

ESP32_H2-ESP32_H2(IDF)学习系列-安装官方组件

1、 在VS Code项目工程中添加IDF组件注册表中的组件十分便捷。您只需按下“CtrlShiftP”快捷键快速进入命令面板&#xff0c;或者通过菜单栏的“查看”选项&#xff0c;选择“命令面板”来打开它。随后&#xff0c;在命令面板中输入“ESP-IDF: Show Component Registry”即可展…

【UE5】UnrealEngine源码构建2:windows构建unreal engine 5.3.2

参考大神知乎的文章:UE5 小白也能看懂的源码编译指南 据说会耗费400G的空间。 代码本身并不大,可能是依赖特别多,毕竟看起来UE啥都能干,核心还是c++的, 【UE5】UnrealEngine源码构建1:tag为5.3.2源码clone 本着好奇+ 学习的态度,想着也许有机会能更为深入的熟悉UE的机制…

[Qt] 常用控件 | QWidget | “表白程序2.0”

目录 一、控件概述 控件体系的发展阶段&#xff1a; 二、QWidget 核心属性 核心属性概览&#xff1a; 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 &#xf…

laravel部署到云服务器上,除了首页之外,区域页面找不到路由

laravel部署到云服务器上&#xff0c;除了首页之外&#xff0c;区域页面找不到路由&#xff0c;都是报404错误 解决方法&#xff1a; &#xff08;注&#xff1a;本人服务器使用宝塔面板&#xff09; 打开宝塔面板&#xff0c;找到该站点->配置文件 在下方增加如下代码 …

git注意事项

提交代码的备注 feat : 开发 新增功能 fix: 修复 git相关 1. git安装及全局用户设置 Git安装 npm install git -ggit修改用户名邮箱密码 git config --global --replace-all user.name "要修改的用户名" git config --global --replace-all user.email"要修改…

Agent系列:AppAgent v2-屏幕智能Agent(详解版)

引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型&#xff08;LLM&#xff09;如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力&#xff0c;并且推动了智能体在自主决策中的应用。…

flink cdc oceanbase

接上文&#xff1a;一文说清flink从编码到部署上线 环境&#xff1a;①操作系统&#xff1a;阿里龙蜥 7.9&#xff08;平替CentOS7.9&#xff09;&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 预研初衷&#xff1a;现在很多项目有国产化的要求&#…

Docker 安装与配置 Nginx

摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时&#xff0c;探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外&#xff0c;文章还涵…

C语言格式输出

1.转换字符说明&#xff1a; 2.常用的打印格式&#xff1a; 在 C 语言中&#xff0c;格式输出主要依靠 printf 函数来实现。以下是一些 C 语言格式输出的代码举例及相关说明。 printf("%2d"&#xff0c;123)&#xff0c;因为输出的部分有三位数&#xff0c;但是要求…

yolov5核查数据标注漏报和误报

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示&#xff1a;以下是本篇文章正文内容&#xff0c;…