使用@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()
相关推荐
“AI国潮设计-小江”1 分钟前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人8 分钟前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
wenwen_chao24 分钟前
Python学习与开发资源合集:实用技巧与工具推荐
python
for_ever_love__1 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司1 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*1 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
sunshine22 girl2 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
XiaoMaqqqq2 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
菜鸟~noob2332 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
ShyanZh2 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp