使用@property将类方法包装为属性

@property 是 Python 里的装饰器 ,核心作用是:把类的「方法」伪装成「普通属性」,像调用属性一样调用方法,还能安全控制属性的访问和修改。

核心作用

  1. 简化调用:调用方法时不用加括号,像访问属性一样直接用
  2. 安全管控:可以隐藏内部属性,限制属性的修改规则
  3. 只读属性 :只定义 @property,不写修改方法,属性就无法被赋值

极简示例

python 复制代码
class Person:
    def __init__(self, name):
        self._name = name  # 下划线表示内部私有属性

    @property  # 装饰器:把方法变成属性
    def name(self):
        # 读取属性时自动执行
        return self._name

# 调用方式(像属性一样,不用加())
p = Person("小明")
print(p.name)  # 输出:小明
# p.name = "小红"  # 报错!只读属性,无法修改

进阶:可修改的属性

搭配 @属性名.setter,就能安全控制修改逻辑:

python 复制代码
class Person:
    def __init__(self, name):
        self._name = name  # 下划线表示内部私有属性

    @property  # 装饰器:把方法变成属性
    def name(self):
        # 读取属性时自动执行
        return self._name

    @name.setter
    def name(self, value):
        # 写入属性时自动执行
        self._name = value

# 调用方式(像属性一样,不用加())
p = Person("小明")
print(p.name)  # 输出:小明
p.name = "小红"  # 设置属性值
print(p.name)  # 输出:小红

总结

  1. @property → 定义读取方法(getter),并伪装成属性
  2. @属性名.setter → 定义修改方法(加校验 / 限制)
  3. 好处:代码简洁、安全可控、符合 Python 优雅的语法风格
  4. 名字必须一样
  5. 只有 @property 时,属性是只读

在QtPy中的应用

定义一个hmi变量,并绑定变量和槽函数,当变量变化时发射信号,执行槽函数。
python 复制代码
import sys

from PySide6.QtCore import QObject, Signal
from PySide6.QtWidgets import QApplication, QPushButton


class HmiVar(QObject):
    valueChanged = Signal(object)
    def __init__(self, var_name, addr, data_type, init_val=None):
        super().__init__()
        self._var_name = var_name    # 变量名
        self._addr = addr            # PLC地址:如 "M0.0" "DB1.DBW0"
        self._data_type = data_type  # bool / int / real
        self._value = init_val

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, v):
        if self._value != v:
            self._value = v
            self.valueChanged.emit(v)

    def set_val(self, v):
        self.value = v

# 绑定变量到槽函数
def bind_var(var: HmiVar, slot):
    var.valueChanged.connect(slot)

var1 = HmiVar("油泵运行", "M0.0", "bool")
bind_var(var1, lambda v: print(f"油泵运行变为: {v}"))

app = QApplication(sys.argv)
btn_start = QPushButton("油泵启/停")
btn_start.clicked.connect(lambda: var1.set_val(not var1.value))
btn_start.show()

app.exec()
相关推荐
Csvn1 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽2 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817534 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱17 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei20 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi001 天前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 天前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill