Python @property 装饰器深度使用教程
一、基础概念与核心原理
1. 装饰器本质
@property 是 Python 内置的属性管理装饰器,它将类方法转换为类属性访问接口。其核心价值在于:
- 封装性:隐藏属性操作的具体实现
- 可维护性:在不改变外部接口的前提下修改内部逻辑
- 安全性:通过验证机制保护数据完整性
2. 运行机制
class Circle:def __init__(self, radius):self._radius = radius # 实际存储的属性@propertydef radius(self): # Getter方法return self._radius@radius.setterdef radius(self, value): # Setter方法if value < 0:raise ValueError("半径不能为负数")self._radius = value
@property: 装饰器创建只读属性(默认)@属性名.setter: 定义可写属性@属性名.deleter: 定义删除行为
二、数据验证与转换
1. 输入验证
class ExamScore:def __init__(self, score):self.score = score@propertydef score(self):return self._score@score.setterdef score(self, value):if not (0 <= value <= 100):raise ValueError("成绩需在0-100之间")self._score = value
特点:
- 自动触发验证逻辑
- 支持动态调整验证规则
2. 单位转换
class Temperature:def __init__(self, celsius):self.celsius = celsius@propertydef fahrenheit(self):return self.celsius * 9/5 + 32@fahrenheit.setterdef fahrenheit(self, value):self.celsius = (value - 32) * 5/9
优势:
- 保持数据一致性
- 自动双向转换
三、动态属性与计算属性
1. 动态计算
class Rectangle:def __init__(self, width, height):self.width = widthself.height = height@propertydef area(self):return self.width * self.height@propertydef perimeter(self):return 2 * (self.width + self.height)
应用场景:
- 依赖多个属性的计算结果
- 高频访问的低复杂度计算
2. 惰性加载
class BigDataAnalysis:def __init__(self, data_path):self.data_path = data_pathself._result = None@propertydef result(self):if self._result is None:print("首次加载大数据...")self._result = self._process_data()return self._resultdef _process_data(self):# 模拟耗时计算return sum(range(10**6))
优势:
- 延迟初始化降低内存消耗
- 避免重复计算
四、继承与扩展应用
1. 子类重写属性
class Shape:@propertydef sides(self):return 0class Triangle(Shape):@propertydef sides(self):return 3
特点:
- 保持接口统一
- 实现多态特性
2. 扩展验证逻辑
class Student:def __init__(self, name):self.name = name@propertydef name(self):return self._name@name.setterdef name(self, value):if not value:raise TypeError("姓名不能为空")self._name = valueclass GraduateStudent(Student):@Student.name.setterdef name(self, value):if not isinstance(value, str):raise ValueError(f"姓名必须是字符串, 传入是{type(value)}")# 调用类的验证条件Student.name.fset(self, value)# 测试代码
yant = GraduateStudent('Yant')
s = GraduateStudent('')
亮点:
- 继承并增强父类验证
- 复用基础校验逻辑
五、实战开发案例
1. 用户权限系统
class UserProfile:def __init__(self, username, roles):self.username = usernameself.roles = roles@propertydef is_admin(self):return 'admin' in self.roles@propertydef access_level(self):return {'guest': 1,'user': 2,'admin': 3}.get(self.roles.lower(), 0)user = UserProfile('Yant', 'guest')
print(user.is_admin) # Output: False
print(user.access_level) # Output: 1
2. 汽车管理系统
class Car:def __init__(self, model, year):self.model = modelself.year = year@propertydef age(self):return 2025 - self.year@propertydef description(self):return f"{self.year}款{self.model}(车龄{self.age}年)"
六、性能优化策略
- 缓存机制:对计算密集型属性使用 functools.lru_cache
- 延迟加载:仅在实际访问时初始化资源
- 避免过度封装:简单属性直接访问
- 类型检查优化:使用 isinstance 代替异常捕获
七、常见误区与解决方案
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| 无限递归错误 | 属性名与实例变量同名 | 使用 _ 前缀命名实例变量 |
| 修改属性未触发更新 | 未通过 setter 方法修改 | 强制使用属性接口操作数据 |
| 多线程环境数据不一致 | 缺乏线程同步机制 | 添加锁机制保护属性访问 |
| 继承后属性验证失效 | 未正确调用父类方法 | 使用 super() 显式调用 |
相关文章:
Python @property 装饰器深度使用教程
一、基础概念与核心原理 1. 装饰器本质 property 是 Python 内置的属性管理装饰器,它将类方法转换为类属性访问接口。其核心价值在于: 封装性:隐藏属性操作的具体实现可维护性:在不改变外部接口的前提下修改内部逻辑安全…...
#VCS# 关于 +incdir+xxx 编译选项的注意点
前段时间,工作中遇到百思不得其解的坑。 按照以往的理解,没有找到任何可能问题点。今天总结下来。 学习目标: +incdir+ 是 VCS 编译器中用于指定 包含文件(include files) 搜索路径的重要选项,主要用于指定 `include 指令的搜索目录。 一 基本功能 作用:添加 Verilog/S…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列拖拽排序示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列…...
JAVA学习-练习试用Java实现“实现一个Hadoop程序,对大数据集中的文本数据进行自然语言处理和关键词筛选”
问题: 使用java语言,实现一个Hadoop程序,对大数据集中的文本数据进行自然语言处理和关键词筛选。 解答思路: 使用Java语言和Hadoop实现自然语言处理和关键词筛选,你需要创建一个MapReduce程序。以下是一个简单的示例&…...
使用idea开发spark程序
新建scala 项目 创建lib目录 将spark jars/ 路径下所有jar 复制到 lib目录 添加依赖 创建scala 程序 package sparkimport org.apache.spark.{SparkConf, SparkContext}object WordCount {def main(args: Array[String]): Unit {val conf new SparkConf().setAppName(&q…...
看懂roslunch输出
自编了一个demo 第一步:创建功能包 cd ~/catkin_ws/src catkin_create_pkg param_demo roscpp第二步:写 main.cpp 创建文件:param_demo/src/param_node.cpp #include <ros/ros.h> #include <string>int main(int argc, char*…...
洛谷题单1-B2005 字符三角形-python-流程图重构
题目描述 给定一个字符,用它构造一个底边长 5 5 5 个字符,高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行,包含一个字符。 输出格式 该字符构成的等腰三角形,底边长 5 5 5 个字符,高 3 3 3 个字符…...
学习日记0327
A cross-domain knowledge tracing model based on graph optimal transport 我们使用gnn来学习这些节点的特征。在此基础上,我们使用显式分布距离度量对齐来自两个不同域的特征向量,旨在最小化域差异,实现最大的跨域知识转移。 AEGOT-CDKT…...
CSS学习笔记6——网页布局
目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…...
dubbo http流量接入dubbo后端服务
简介 dubbo协议是基于TCP的二进制私有协议,更适合作为后端微服务间的高效RPC通信协议,也导致dubbo协议对于前端流量接入不是很友好。在dubo框架中,有两种方式可以解决这个问题: 多协议发布【推荐】,为dubbo协议服务暴…...
线程同步——互斥锁
线程同步——互斥锁 目录 一、基本概念 二、打印成对出现的字母 三、生产者消费者(有限缓冲问题) 3.1 基本概念 3.2 代码实现 一、基本概念 互斥锁是一种用于控制对共享资源访问的同步机制。它确保在同一时间内,只有一个线程可以访问被…...
机试题——村落基站建设
题目描述 假设村落以二叉树的形状分布,我们需要选择在哪些村落建设基站。如果某个村落建设了基站,那么它和它相邻的村落(包括本节点、父节点和子节点)也会有信号覆盖。目标是计算出最少需要建设的基站数。 输入描述 输入为一个…...
C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent
完整项目托管地址:https://github.com/sometiny/http HTTP还有重要的一块:文件上传。 这篇文章将详细讲解下,前面实现了同一个链接处理多个请求,为了方便,我们独立写了一个HTTP基类,专门处理HTTP请求。 ht…...
leetcoed0044. 通配符匹配 hard
1 题目:通配符匹配 官方难度:难 给你一个输入字符串 (s) 和一个字符模式 ( p ) ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序…...
蓝桥杯嵌入式第十二届程序设计题
一、题目概览 设计一个小型停车计费系统 二、分模块实现 1、LCD void disp_proc() {if(view0){char text[30];sprintf(text," Data");LCD_DisplayStringLine(Line2,(uint8_t *)text);sprintf(text," CNBR:%d ",Cnum);LCD_DisplayStri…...
第十四届MathorCup高校数学建模挑战赛-C题:基于 LSTM-ARIMA 和整数规划的货量预测与人员排班模型
目录 摘要 一、 问题重述 1.1 背景知识 1.2 问题描述 二、 问题分析 2.1 对问题一的分析 2.2 对问题二的分析 2.3 对问题三的分析 2.4 对问题四的分析 三、 模型假设 四、 符号说明 五、 问题一模型的建立与求解 5.1 数据预处理 5.2 基于 LSTM 的日货量预测模型 5.3 日货量预测…...
python多态、静态方法和类方法
目录 一、多态 二、静态方法 三、类方法 一、多态 多态(polymorphism)是面向对象编程中的一个重要概念,指的是同样的方法调用可以在不同的对象上产生不同的行为。在Python中,多态是通过方法的重写(override&#x…...
DTMF从2833到inband的方案
概述 freeswitch是一款简单好用的VOIP开源软交换平台。 之前的文章中介绍过通过dialplan拨号计划配置的方法,实现2833到inband的转换,但是实际生产环境中的场景会更复杂,无法预先在dialplan中设置好相关参数和函数。 环境 CentOS 7.9 fr…...
在Vue 3 + TypeScript + Vite 项目中安装和使用 SCSS
在Vue 3 TypeScript Vite 项目中安装和使用 SCSS 1、安装 SCSS 的相关依赖 npm install sass --save-dev2、配置 Vite 对于 Vue 3,Vite 已经内置了对 SCSS 的支持,通常不需要额外的配置。但是,如果需要自定义配置,可以在路径…...
Uni-app入门到精通:tabBar节点实现多页面的切换
tabBar节点用于实现多页面的切换。对于一个多tabBar应用,可以通过tabBar节点配置项指定一级导航栏,以及tabBar切换时显示的对应页面。在pages.json中提供tabBar节点配置,不仅是为了方便快速开发导航,更重要的是提示App平台和小程序…...
Qt正则表达式QRegularExpression
在 Qt 中,正则表达式是处理文本的强大工具,它能够帮助我们匹配、搜索和替换特定的字符串模式。自 Qt 5 起,QRegularExpression 类提供了对 ECMAScript 标准的正则表达式支持,这使得它在处理各种复杂的字符串任务时变得更加高效和灵…...
Go 语言规范学习(3)
文章目录 Properties of types and valuesRepresentation of valuesUnderlying types【底层类型】Core types【核心类型】Type identityAssignabilityRepresentabilityMethod sets BlocksDeclarations and scopeLabel scopesBlank identifierPredeclared identifiersExported i…...
小林coding-17道Java基础面试题
1.说一下Java的特点?Java 的优势和劣势是什么?Java为什么是跨平台的?JVM、JDK、JRE三者关系?为什么Java解释和编译都有? jvm是什么?编译型语言和解释型语言的区别? Python和Java区别是什么? 2.八种基本的…...
ETCD --- 租约(Lease)详解
一、租约的核心概念 1. 租约(Lease) 一个租约是一个有时间限制的“授权”,绑定到键值对上。每个租约有一个唯一的ID(64位整数),通过etcdctl或客户端API创建。创建租约时需指定TTL(Time-To-Live),即租约的有效期(单位:秒)。客户端需定期向etcd发送续约(KeepAl…...
运筹说 第134期 | 矩阵对策的解法
上一期我们了解了矩阵对策的基本理论,包含矩阵对策的纯策略、矩阵对策的混合策略和矩阵对策的基本定理。 接下来小编将为大家介绍矩阵对策的解法,包括图解法、方程组法和线性规划法三种经典方法。 01 图解法 本节首先介绍矩阵对策的图解法,…...
3. 轴指令(omron 机器自动化控制器)——>MC_CamOut
机器自动化控制器——第三章 轴指令 15 MC_CamOut变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶指令的中止▶重启运动指令▶多重启动运动指令▶异常 MC_CamOut 结束通过输入参数指定的轴的凸轮动作 指令名称FB/FUN图形表现ST表现MC_CamOut解除凸轮动作FBMC_Cam…...
TF32 与 FP32 的区别
TF32(Tensor Float 32)与FP32(单精度浮点数)是两种用于深度学习和高性能计算的浮点格式,其核心区别体现在精度、性能优化和应用场景上。以下是两者的详细对比分析: 一、位宽与结构差异 FP32的位宽结构 FP32…...
【大模型】视觉语言模型:Qwen2.5-VL的使用
官方github地址:https://github.com/QwenLM/Qwen2.5-VL 目录 Qwen家族的最新成员:Qwen2.5-VL 主要增强功能 模型架构更新 快速开始 使用Transformers聊天 Docker Qwen家族的最新成员:Qwen2.5-VL 主要增强功能 强大的文档解析功能&am…...
Web前端之UniApp、Taro、ReactNative和Flutter的区别
MENU 前言介绍及公司技术差异使用方法使用场景差异注意事项打包与部署差异框架应用实例结语 前言 在移动应用开发领域,跨平台框架已成为开发者的得力工具。UniApp、Taro、ReactNative和Flutter它们在Android(安卓)或iOS(苹果&…...
测试用例与需求脱节的修复方案
测试用例与需求脱节的问题可通过明确需求定义、加强需求追踪、建立有效沟通机制进行修复。其中,加强需求追踪尤为关键,能确保测试用例与实际需求的精确匹配,避免资源浪费和测试效果不佳。据行业研究,约70%的软件缺陷源于需求管理不…...
