使用@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()
相关推荐
free-elcmacom1 分钟前
C++学习<1>程序分区
开发语言·c++
会飞锦鲤6 分钟前
基于 Mask R-CNN 的药片缺陷检测系统
人工智能·pytorch·python·神经网络·resnet-50
醉颜凉8 分钟前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语9 分钟前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
Brilliantwxx36 分钟前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
清水白石00841 分钟前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
kolyle1 小时前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署
caoerzhong1 小时前
JeeWMS 开源仓库管理系统 GPL-3.0 合规指南:Java WMS 二次开发前必须弄清的授权边界
java·开发语言·开源·vue
Patrick在香港1 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·大数据毕设项目