​Python 中的 @property 特性详解​

@property 是 Python 中用于​​将方法转换为属性​​的装饰器,它允许开发者以访问属性的方式调用方法,同时可以添加逻辑控制(如数据校验、计算属性等)。以下是其核心用法和优势:


​一、@property 的基本用法​

​1. 将方法变为只读属性​

class Circle:def __init__(self, radius):self.radius = radius@propertydef area(self):  # 通过方法计算面积,但调用时像属性return 3.14 * self.radius ** 2c = Circle(5)
print(c.area)  # 78.5(无需括号,像访问属性)
# c.area = 100  # 报错!area是只读属性

​2. 添加 setter 和 deleter​

通过 @属性名.setter@属性名.deleter 控制属性的写入和删除:

class Temperature:def __init__(self, celsius):self._celsius = celsius  # 内部存储摄氏度@propertydef celsius(self):  # 读操作return self._celsius@celsius.setterdef celsius(self, value):  # 写操作(可校验)if value < -273.15:raise ValueError("温度不能低于绝对零度")self._celsius = value@propertydef fahrenheit(self):  # 计算属性(华氏度)return self._celsius * 9/5 + 32temp = Temperature(25)
print(temp.fahrenheit)  # 77.0(自动计算)
temp.celsius = 30       # 通过 setter 修改
# temp.celsius = -300    # 触发 ValueError

​二、@property 的核心优势​

​1. 数据校验​

在 setter 中限制属性值的合法性:

class User:def __init__(self, name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self, value):if not isinstance(value, str):raise TypeError("姓名必须是字符串")self._name = valueuser = User("Alice")
user.name = "Bob"  # 合法
# user.name = 123   # 报错:TypeError

​2. 计算属性​

动态生成属性值(如面积、平均值):

class Rectangle:def __init__(self, width, height):self.width = widthself.height = height@propertydef area(self):return self.width * self.heightrect = Rectangle(3, 4)
print(rect.area)  # 12(自动计算)

​3. 兼容性​

在不改变外部接口的情况下修改内部实现:

class OldClass:def __init__(self, value):self.value = value  # 直接暴露属性# 改为使用 @property 后,外部代码无需修改
class NewClass:def __init__(self, value):self._value = value@propertydef value(self):return self._value * 2  # 内部逻辑变化

​三、@property 与普通方法的区别​

​特性​@property​普通方法​
​调用方式​obj.property(无括号)obj.method()(需括号)
​功能​像属性一样访问,但可包含逻辑显式执行操作
​可写性​需配合 setter 才能修改可直接修改返回值

​四、实际应用场景​

​1. 数据模型(如 Django ORM)​

class Product:def __init__(self, price):self._price = price@propertydef price_with_tax(self):return self._price * 1.1  # 自动计算含税价格

​2. API 设计​

隐藏内部字段名,提供统一接口:

class APIResponse:def __init__(self, raw_data):self._raw_data = raw_data@propertydef data(self):return self._raw_data["data"]  # 封装原始数据解析

​3. 兼容旧代码​

逐步替换直接暴露的属性:

class LegacyClass:def __init__(self, x):self.x = x  # 旧代码直接访问 x# 新代码改用 @property
class ModernClass:def __init__(self, x):self._x = x@propertydef x(self):return self._x ** 2  # 新增逻辑

​五、总结​

​要点​​说明​
​基本功能​将方法伪装成属性,保持调用简洁性
​核心方法​@property(读)、@attr.setter(写)、@attr.deleter(删)
​优势​数据校验、计算属性、接口兼容性
​适用场景​需要控制属性访问或动态计算的场景

​核心价值​​:
​以属性的语法实现方法的功能​​,兼顾简洁性与灵活性。

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

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

相关文章

【Redis#9】其他数据结构

引言 Redis 除了我们最常用的 String、Hash、List、Set、ZSet&#xff08;Sorted Set&#xff09; 这五种基本数据结构外&#xff0c;还提供了很多高级或特殊用途的数据结构/类型 &#xff0c;它们可以满足更复杂的业务需求。 ✅ Redis 的“五大基本数据结构”回顾类型特点Stri…

AutoGen——自定义Agent

目录引子自定义 AgentCountDownAgentArithmeticAgent在自定义 Agent 中使用自定义模型客户端让自定义 Agent 声明式化Selector Group Chat示例&#xff1a;网页搜索 / 数据分析代理&#xff08;Agents&#xff09;Workflow终止条件&#xff08;Termination Conditions&#xff…

【重定向和转发的核心理解】

重定向和转发 不废话&#xff1a; “转发” 的核心定义&#xff1a; 服务端内部主导跳转、客户端无感知&#xff08;仅 1 次请求&#xff09;、浏览器 URL 不改变&#xff0c;与传统 Web 开发中 “转发” 的本质逻辑完全一致&#xff0c;只是实现载体&#xff08;Nginx 路由层 …

生成对抗网络详解与实现

生成对抗网络详解与实现0. 前言1. GAN 原理2. GAN 架构3. 损失函数3.1 判别器损失3.2 生成器损失3.4 VANILLA GAN4. GAN 训练步骤0. 前言 生成对抗网络 (Generative Adversarial Network, GAN) 是图像和视频生成中的主要方法之一。在本节中&#xff0c;我们将了解 GAN 的架构、…

FPGA硬件开发-XPE工具的使用

目录 XPE 工具概述​ XPE 使用步骤详解​ 1. 工具获取与初始化​ 2. 器件选择与配置​ 3. 电源电压设置​ 4. 资源使用量配置​ 5. 时钟与开关活动配置​ 6. 功耗计算与报告生成​ 报告解读与电源设计优化​ 常见问题与最佳实践​ 与实际功耗的差异处理​ 工具版本…

CentOS 7.9 RAID 10 实验报告

文章目录CentOS 7.9 RAID 10 实验报告一、实验概述1.1 实验目的1.2 实验环境1.3 实验拓扑二、实验准备2.1 磁盘准备2.2 安装必要软件三、RAID 10阵列创建3.1 创建RAID 10阵列3.2 创建文件系统并挂载3.3 保存RAID配置四、性能基准测试4.1 初始性能测试4.2 创建测试数据集五、故障…

机器人逆运动学进阶:李代数、矩阵指数与旋转流形计算

做机器人逆运动学&#xff08;IK&#xff09;的时候&#xff0c;你迟早会遇到矩阵指数和对数这些东西。为什么呢&#xff1f;因为计算三维旋转的误差&#xff0c;不能简单地用欧氏距离那一套&#xff0c;那只对位置有效。旋转得用另一套方法——你需要算两个旋转矩阵之间的差异…

计算机视觉(opencv)实战十八——图像透视转换

图像透视变换详解与实战在图像处理中&#xff0c;透视变换&#xff08;Perspective Transform&#xff09; 是一种常见的几何变换&#xff0c;用来将图像中某个四边形区域拉伸或压缩&#xff0c;映射到一个矩形区域。常见应用场景包括&#xff1a;纠正拍照时的倾斜&#xff08;…

【飞书多维表格插件】

coze中添加飞书多维表格记录插件 添加单条记录 [{"fields":{"任务详情":"选项1","是否完成":"未完成"}}]添加多条记录 [{"fields":{"任务详情":"选项1","是否完成":"已完…

Java基础 9.14

1.Collection接口遍历对象方式2-for循环增强增强for循环&#xff0c;可以代替iterator选代器&#xff0c;特点&#xff1a;增强for就是简化版的iterator本质一样 只能用于遍历集合或数组package com.logic.collection_;import java.util.ArrayList; import java.util.Collectio…

数据结构(C语言篇):(十三)堆的应用

目录 前言 一、堆排序 1.1 版本一&#xff1a;基于已有数组建堆、取栈顶元素完成排序 1.1.1 实现逻辑 1.1.2 底层原理 1.1.3 应用示例 1.1.4 执行流程 1.2 版本二&#xff1a;原地排序 —— 标准堆排序 1.2.1 实现逻辑 1.2.2 底层原理 1.2.3 时间复杂度计算…

4步OpenCV-----扫秒身份证号

这段代码用 OpenCV 做了一份“数字模板字典”&#xff0c;然后在银行卡/身份证照片里自动找到身份证号那一行&#xff0c;把每个数字切出来跟模板比对&#xff0c;最终输出并高亮显示出完整的身份证号码&#xff0c;下面是代码解释&#xff1a;模块 1 工具箱&#xff08;通用函…

冯诺依曼体系:现代计算机的基石与未来展望

冯诺依曼体系&#xff1a;现代计算机的基石与未来展望 引人入胜的开篇 当你用手机刷视频、用电脑办公时&#xff0c;是否想过这些设备背后共享的底层逻辑&#xff1f;从指尖轻滑切换APP&#xff0c;到电脑秒开文档&#xff0c;这种「无缝衔接」的体验&#xff0c;其实藏着一个改…

前端基础 —— C / JavaScript基础语法

以下是对《3.JavaScript(基础语法).pdf》的内容大纲总结&#xff1a;---&#x1f4d8; 一、JavaScript 简介 - 定义&#xff1a;脚本语言&#xff0c;最初用于表单验证&#xff0c;现为通用编程语言。 - 应用&#xff1a;网页开发、游戏、服务器&#xff08;Node.js&#xff09…

springboot 二手物品交易系统设计与实现

springboot 二手物品交易系统设计与实现 目录 【SpringBoot二手交易系统全解析】从0到1搭建你的专属平台&#xff01; &#x1f50d; 需求确认&#xff1a;沟通对接 &#x1f5e3; &#x1f4ca; 系统功能结构&#xff1a;附思维导图 ☆开发技术&#xff1a; &#x1f6e…

【Android】可折叠式标题栏

在 Android 应用开发中&#xff0c;精美的用户界面可以显著提升应用品质和用户体验。Material Design 组件中的 CollapsingToolbarLayout 能够为应用添加动态、流畅的折叠效果&#xff0c;让标题栏不再是静态的元素。本文将深入探讨如何使用 CollapsingToolbarLayout 创建令人惊…

Debian13下使用 Vim + Vimspector + ST-LINK v2.1 调试 STM32F103 指南

1. 硬件准备与连接 1.1 所需硬件 STM32F103C8T6 最小系统板ST-LINK v2.1 调试器连接线&#xff08;杜邦线&#xff09; 1.2 硬件连接 ST-LINK v2.1 ↔ STM32F103C8T6 连接方式&#xff1a;ST-LINK v2.1 引脚STM32F103C8T6 引脚功能说明SWDIOPA13数据线SWCLKPA14时钟线GNDGND共地…

第21课:成本优化与资源管理

第21课:成本优化与资源管理 课程目标 掌握计算资源优化 学习成本控制策略 了解资源调度算法 实践实现成本优化系统 课程内容 21.1 成本分析框架 成本分析系统 class CostAnalysisFramework {constructor(config) {this.config

SAP HANA Scale-out 04:CalculationView优化

CV执行过程计算视图激活时&#xff0c;生成Stored ModelSELECT查询时&#xff1a;首先将Stored Model实例化为runtime Model 计算引擎执行优化&#xff0c;将runtime Model转换为Optimized Runtime ModelOptimized Runtime Model通过SQL Optimizer进行优化计算引擎优化特性说明…

鸿蒙审核问题——Scroll中嵌套了List/Grid时滑动问题

文章目录背景原因解决办法1、借鉴Flutter中的解决方式&#xff0c;如下图2、鸿蒙Next中对应的解决方式&#xff0c;如下图3、官方文档回访背景 来源一次审核被拒的情况。也是出于粗心导致的。之前在flutter项目中也是遇到过这种问题的。其实就是滚动视图内嵌滚动视图造成的&am…