python | Python中使用@property装饰器

news2024/9/21 0:42:19

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。

原文链接:Python中使用@property装饰器

在Python中,@property装饰器是一种强大且优雅的工具,用于定义属性方法,使得类的属性访问更加直观和安全。@property装饰器可以让方法像属性一样被访问,从而在不改变接口的情况下对类的属性访问进行控制。本文将详细介绍@property装饰器的使用方法及其优点,并通过具体的示例代码展示如何在实际项目中应用。

为什么使用@property装饰器

在面向对象编程中,直接访问类的属性虽然简单,但容易导致数据不一致或不安全。例如,某些属性需要在访问前进行验证,或者在修改后需要自动更新其他相关属性。使用@property装饰器可以有效地解决这些问题,带来以下几个好处:

  1. 封装性:通过@property,可以隐藏属性的实现细节,保护属性的访问。

  2. 可读性:让属性访问看起来像是直接访问,但实际上可以包含逻辑处理。

  3. 兼容性:不改变类的接口,方便旧代码的迁移和维护。

使用@property装饰器定义属性

@property装饰器用于定义只读属性,可以通过定义gettersetterdeleter方法来控制属性的访问和修改。

定义只读属性

通过@property装饰器,可以将方法转换为只读属性。

示例:定义一个只读属性

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

# 使用示例
circle = Circle(5)
print(circle.radius)  # 输出: 5
# circle.radius = 10  # 试图赋值会导致AttributeError

在这个示例中,radius属性是只读的,因为只有getter方法,没有setter方法。

定义可写属性

通过定义setter方法,可以将属性设置为可写的,同时可以在设置属性时添加逻辑处理。

示例:定义一个可写属性

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value <= 0:
            raise ValueError("半径必须是正数")
        self._radius = value

# 使用示例
circle = Circle(5)
print(circle.radius)  # 输出: 5
circle.radius = 10
print(circle.radius)  # 输出: 10
# circle.radius = -1  # 会引发ValueError: 半径必须是正数

在这个示例中,radius属性是可写的,并且在设置属性值时进行了验证,确保半径必须是正数。

定义可删除属性

通过定义deleter方法,可以控制属性的删除行为。

示例:定义一个可删除属性

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value <= 0:
            raise ValueError("半径必须是正数")
        self._radius = value

    @radius.deleter
    def radius(self):
        del self._radius

# 使用示例
circle = Circle(5)
print(circle.radius)  # 输出: 5
del circle.radius
# print(circle.radius)  # 会引发AttributeError: 'Circle' object has no attribute '_radius'

在这个示例中,radius属性可以被删除,删除后再访问该属性会引发AttributeError

实际应用案例

温度转换类

以下示例展示了如何使用@property装饰器定义一个温度转换类,实现摄氏温度和华氏温度的相互转换。

class Temperature:
    def __init__(self, celsius=0):
        self._celsius = celsius

    @property
    def celsius(self):
        return self._celsius

    @celsius.setter
    def celsius(self, value):
        self._celsius = value

    @property
    def fahrenheit(self):
        return self._celsius * 9 / 5 + 32

    @fahrenheit.setter
    def fahrenheit(self, value):
        self._celsius = (value - 32) * 5 / 9

# 使用示例
temp = Temperature()
temp.celsius = 25
print(temp.fahrenheit)  # 输出: 77.0

temp.fahrenheit = 212
print(temp.celsius)  # 输出: 100.0

在这个示例中,Temperature类包含celsiusfahrenheit两个属性,使用@property装饰器实现了摄氏温度和华氏温度的相互转换。

高级用法

使用property()函数

除了使用@property装饰器,还可以使用property()函数创建属性。这种方法更适用于需要动态创建属性的场景。

示例:使用property()函数创建属性

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    def get_width(self):
        return self._width

    def set_width(self, value):
        if value <= 0:
            raise ValueError("宽度必须是正数")
        self._width = value

    def del_width(self):
        del self._width

    width = property(get_width, set_width, del_width)

# 使用示例
rect = Rectangle(5, 10)
print(rect.width)  # 输出: 5
rect.width = 20
print(rect.width)  # 输出: 20
del rect.width
# print(rect.width)  # 会引发AttributeError: 'Rectangle' object has no attribute '_width'

在这个示例中,property()函数用于创建width属性,实现了属性的获取、设置和删除方法。

组合属性和方法

有时候需要组合属性和方法,通过@property装饰器,可以在属性方法中调用其他方法,实现复杂的逻辑处理。

示例:计算矩形的面积和周长

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        if value <= 0:
            raise ValueError("宽度必须是正数")
        self._width = value

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        if value <= 0:
            raise ValueError("高度必须是正数")
        self._height = value

    @property
    def area(self):
        return self.width * self.height

    @property
    def perimeter(self):
        return 2 * (self.width + self.height)

# 使用示例
rect = Rectangle(5, 10)
print(f"面积: {rect.area}")  # 输出: 面积: 50
print(f"周长: {rect.perimeter}")  # 输出: 周长: 30

在这个示例中,Rectangle类包含widthheight两个可读写属性,以及areaperimeter两个只读属性,分别用于计算矩形的面积和周长。

总结

本文详细介绍了Python中@property装饰器的使用方法及其优点。通过@property装饰器,可以将方法转换为属性,从而在不改变接口的情况下对属性的访问进行控制。通过具体的示例代码展示了如何定义只读属性、可写属性和可删除属性,以及如何在实际应用中使用@property装饰器提高代码的可读性和安全性。掌握这些技巧,可以帮助大家编写出更加优雅和健壮的代码。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Python]案例驱动最佳入门:股票分析 Python数据分析与可视化实战

在股票市场中&#xff0c;价格波动和投资决策紧密相连。通过数据分析&#xff0c;投资者可以识别市场趋势、价格波动背后的规律&#xff0c;并做出明智的投资决策。Python凭借其强大的数据处理和可视化功能&#xff0c;在金融市场分析中被广泛应用。本文将通过一个假设的股票市…

java踩坑

1.mybatis在idea可以正常运行&#xff0c;但是打jar包后&#xff0c;就报链接超时&#xff0c;可能是参数设置有问题&#xff0c;但是idea自动忽略了。 出问题的配置&#xff1a;&#xff08;圈出来的地方乱码了&#xff0c;idea有纠错能力&#xff0c;它自动调整为正确的&…

three.js shader 实现天空中白云

three.js shader 实现天空中白云 预览&#xff1a; https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idwhiteCloud 更多案例 可见 预览&#xff1a; https://threehub.cn import * as THREE from "three"; import { OrbitControls …

web基础—dvwa靶场(十二)JavaScript Attacks

JavaScript Attacks (前端攻击) 本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作&#xff0c;攻击可以通过分析网络流量来实现&#xff0c;但这不是本章节的重点而且可能要困难得多。 只需提交单词 “success” 即可攻击成功&#xff0c;显然…

开石开放式耳机怎么样?南卡、开石、声阔开放式耳机测评

​作为一名多年的数码博主&#xff0c;我本人也是个耳机发烧友&#xff0c;我最近注意到数码圈特别是蓝牙耳机圈中&#xff0c;有一种耳机特别火&#xff0c;叫开放式耳机&#xff0c;这类耳机的佩戴舒适度是非常高的&#xff0c;这也激起了我对这类耳机的兴趣&#xff0c;因此…

感知笔记4:YOLO 3D 物体定位

如何在 ROS 中使用 YOLO 如何在 2D 中检测人和大象如何在 3D 中检测人和大象 有许多可用的深度学习库。您可能听说过&#xff1a;Keras、TensorFlow 和 Darknet。 在这里我们将使用 Darknet&#xff0c;因为它实现了 YOLOv3&#xff0c;这是一个对象检测模型。它非常快&…

jdk版本更换以及遇到的问题略谈(以jdk1.8和jdk11为例)

目录 在我看来 遇到的问题 原因以及解决方法 方法一&#xff1a;禁止误改误删 方法二&#xff1a;bat文件驱动运行 方法三&#xff1a;cmd命令 方法四&#xff1a;修改注册表&#xff08;不推荐&#xff09; 最近在进行漏洞复现&#xff08;shiro550&#xff09;的时候&…

无人机如何突破高海拔高寒飞行环境?

无人机在突破高海拔高寒飞行环境方面&#xff0c;需要解决一系列技术难题和挑战。以下是一些主要的技术手段和策略&#xff1a; 1. 无人机平台设计与优化 增强机体结构&#xff1a;采用轻质高强度的材料&#xff0c;如碳纤维、复合材料等&#xff0c;减轻机身重量&#xff0c…

决策树算法中篇

手动计算实现决策树分类 数据整合 X[真实用户] y X 计算未划分信息熵 s X[真实用户] p s.value_counts()/s.size (p * np.log2(1/p)).sum() 按照日志密度进行划分 x X[日志密度].unique() x.sort() # 如何划分呢&#xff0c;分成两部分 for i in range(len(x) - 1):sp…

【目标检测论文必备】通俗易懂地讲解用绿色、蓝色、红色框可视化描述YOLO模型权重对于单个图片的训练效果(TP、FP、FN)

可视化步骤 一、生成自定义权重对图片的预测类别坐标信息二、创建需要预测的文件夹三、可视化运行 一、生成自定义权重对图片的预测类别坐标信息 新建脚本文件/path/to/your/ultralytics/savetxt.py放入对应参数运行会得到一个个独立的/path/to/your/runs/detect/output/outpu…

移动技术开发:简单计算器界面

1 实验名称 简单计算器界面 2实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

2024年港澳台华侨生联考分数线继续更新来啦

导读 在最近的一系列分享中&#xff0c;我们和大家一同分享了2024年港澳台华侨生联考的分数线。今天我们继续和大家一起分享一些2024年港澳台联考的高校录取分数线吧&#xff01; 首都师范大学 首都师范大学和首都医科大学作为被低估的两所高校&#xff0c;这两年的分数线也是…

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

【数据结构取经之路】图解红黑树

目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 左右旋动图 红黑树的插入分析 红黑树的插入代码 红黑树与AVL-tree比较 红黑树的应用场景 前言 AVL-tree之外&#xff0c;另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree)&#xff0c;这名字听起来…

码头童话,“丈量”行业数智化转型

作者 | 曾响铃 文 | 响铃说 一箱车厘子从地球正对的另一边远渡重洋来到中国&#xff0c;而一旦到达&#xff0c;5个小时内它就能变成北京、天津、河北、河南等区域老百姓果盘里的美味。 这一幕&#xff0c;来自央视联合华为制作发布的《新智中国说-谈智一会间》第一期“码头…

PHP邮件发送教程:如何用PHP发送电子邮件?

php邮件怎么实现发送电子邮件&#xff1f;php怎么给邮箱发邮件&#xff1f; PHP作为一种广泛使用的服务器端脚本语言&#xff0c;提供了多种方法来实现电子邮件的发送。AokSend将详细介绍如何使用PHP邮件功能来发送电子邮件&#xff0c;帮助开发者轻松实现这一重要功能。 PHP…

30道常见的软件测试面试题(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明确&#xff0c;需求不会频繁变动 2&#xff09;项…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…