Python 利用@property装饰器和property()方法将一个方法变成属性调用

news2024/9/20 20:26:04

目录

方法一:使用@property装饰器

方法二:使用property()创建类属性


在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改。

 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,在这些方法中还可以增加一些检查操作,比如在get_score中增加获取权限操作,在set_score中增加输入检查操作。

class Student(object):

    def __init__(self):
        self._score = 60

    def get_score(self):
        print(self._score)
        return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value


if __name__ == "__main__":
    s = Student()
    s.get_score()
    s.set_score("aaa")      # 语法报错

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了。但是,上面的调用方法又略显复杂,没有直接调用属性这么直接简单。

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!

方法一:使用@property装饰器

@property装饰器可以把一个类方法以获取属性的方式进行调用。@property装饰器只能获取值,如果要进行赋值或删除操作,就要使用到伴生装饰器@XXX.setter和@XXX.deleter(XXX为@property装饰的方法名称)

被@XXX.setter装饰的方法在赋值时被调用

被@XXX.deleter装饰的方法在对象被删除时被调用

class Student(object):

    def __init__(self):
        self._score = 60

    @property   # 取值操作
    def score(self):
        print("@property被调用")
        return self._score

    @score.setter   # 赋值操作
    def score(self, value):     # 赋予的值传给value
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
        print("@score.setter被调用")

    @score.deleter  # 删除操作
    def score(self):
        self._score = 0
        print("@score.deleter被调用")


if __name__ == "__main__":
    s = Student()
    s.score     # 当获取属性值时执行@property
    s.score = 99    # 当赋值属性值时执行 @**.setter
    del s.score     # 当删除属性值时执行 @**.deleter

执行结果为:

方法二:使用property()创建类属性

第二种方式看起来与使用@property装饰器之前的方式相差不大,唯一不同的是使用了property()方法创建了一个类属性

class Student(object):

    def __init__(self):
        self._score = 60

    def get_score(self):
        print(self._score)
        return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
        print(f"修改score为{self._score}")

    def del_score(self):
        self._score = 0
        print("删除score")

    score = property(get_score, set_score, del_score)   

if __name__ == "__main__":
    s = Student()
    s.score     # 当获取属性值时,执行property()的第一个方法
    s.score = 99    # 当赋值属性值时,执行property()的第二个方法
    del s.score     # 当删除属性值时执行,执行property()的第三个方法。注意:实际项目中很少用该方法。

上面两种方法最终实现的效果是一样的,也没有使用限制,喜欢用哪种就用哪种!


-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



 以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

 

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

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

相关文章

springboot集成openfeign,集成Histric

一、Feign简介 Feign是一个声明式的伪Http客户端&#xff0c;它使得写Http客户端变得更简单。使用Feign&#xff0c;只需要创建一个接口并注解。它具有可插拔的注解特性&#xff0c;可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon&…

Echarts入门(SpringBoot + Vue)

一、Echarts简介 代码已上传至码云:echarts_boot: echarts使用demo ECharts是一个使用 JavaScript 实现的"数据可视化"库, 它可以流畅的运行在 PC 和移动设备上 什么是数据可视化? 也就是可以将数据通过图表的形式展示出来&#xff0c; Echarts官网:Apache ECh…

9-如何获取N维数组元素?【视频版】

目录 问题视频解答 问题 视频解答 点击观看&#xff1a; 9-如何获取N维数组元素&#xff1f;

基于 Opencv python实现批量图片去黑边—裁剪—压缩软件

简介 批量处理图片文件&#xff0c;批量提取GIF图片中的每一帧&#xff0c;具有范围裁剪、自动去除黑/白边、调整大小、压缩体积等功能。 先看一些软件的界面&#xff0c;是基于Tkinter写的GUI 裁剪等功能基于Opencv 下载 我添加了处理GIF的github&#xff1a; 原作者的gith…

基于Ant DesignPro Vue + SpringBoot 前后端分离 - 后端微服化 + 接口网关 + Nacos

基于Ant DesignPro Vue SpringBoot 前后端分离 - 后端微服化 接口网关 Nacos 通过Ant DesignPro Vue SpringBoot 搭建的后台管理系统后&#xff0c;实现了前后端分离&#xff0c;并实现了登录认证&#xff0c;认证成功后返回该用户相应权限范围内可见的菜单。 后端采用Spri…

一、枚举类型——新特性(将 switch 作为表达式)

switch 一直以来都只是一个语句&#xff0c;并不会生成结果。 JDK 14 使得 switch 还可以作为 一个表达式来使用&#xff0c;因此它可以得到一个值&#xff1a; SwitchExpression.java public class SwitchExpression {static int colon(String s) {var result switch (s) {ca…

基于单片机的智能点滴速度输液液体检测

功能介绍 以51单片机作为主控系统&#xff1b;显示液位&#xff0c;滴数&#xff0c;温度等信息&#xff1b;通过水位传感器检测当前药瓶是否有水&#xff1b;通过滴速传传感器利用单片机定时器计算当前滴速&#xff1b;通过DS18B20温度传感器采集当前药液温度&#xff0c;继电…

【前端】JS语法——数据类型转换

一、字符串&#xff08;里面必须数字&#xff09;转换为数字类型&#xff08;number&#xff09; 1、强制转换&#xff1a;(parseInt()、parseFloat()、Number())&#xff1b; 2、隐式转换&#xff08;number[-/*%]string&#xff09;&#xff1b; <script>let s &qu…

红米K60刷入MIUI.EU安装面具magisk与root教程

文章目录 前言1.解锁BootLoader2.刷入Recovery3.刷入EU的ROM包4.刷入magisk面具后话 前言 教程大概就是四步&#xff0c;解锁&#xff0c;刷入rec&#xff0c;刷入系统&#xff0c;刷入面具&#xff0c;跟着教程走即可。这次是刷机方式&#xff1a;卡刷&#xff08;Recovery&a…

SELECT * 会导致查询效率低的原因

SELECT * 会导致查询效率低的原因 前言一、适合SELECT * 的使用场景二、SELECT * 会导致查询效率低的原因2.1、数据库引擎的查询流程2.2、SELECT * 的实际执行过程2.3、使用 SELECT * 查询语句带来的不良影响 三、优化查询效率的方法四、总结 前言 因为 SELECT * 查询语句会查…

PCL可视化 3D点云PCD文件

工具安装 sudo apt install pcl-tools 启动命令&#xff1a; pcl_viewer 000000.pcd

chatgpt赋能python:在Python官网上下载Python:一位有10年Python编程经验的工程师分享

在Python官网上下载Python&#xff1a;一位有10年Python编程经验的工程师分享 Python是如今最受欢迎的编程语言之一。它是一种易学易用、具有广泛用途的开源语言。如果您刚开始使用Python&#xff0c;或者想要更新到最新版本的Python&#xff0c;Python官网是一个很好的起点。…

QT学习笔记4--自定义信号的槽

逻辑&#xff1a;下课后&#xff0c;老师饿了&#xff0c;学生请吃饭。 使用connect函数连接自定义的信号和槽函数。 创建类 信号 #ifndef TEACHER_H #define TEACHER_H#include <QObject>class teacher : public QObject {Q_OBJECT public:explicit teacher(QObjec…

浙江专升本高等数学易错例题讲解-函数间断点

例题 考察内容&#xff1a;间断点的判断 易错点分析&#xff1a;化简时不能把负数带入根号 浙江专升本高等数学易错例题讲解-函数间断点

【前端1】标签,css,js

文章目录 1.标签&#xff1a;input1.1 html&#xff1a;HTML&#xff08;用于创建网页结构&#xff09;&#xff0c;CSS&#xff08;对页面进行美化&#xff09;&#xff0c;JavaScript&#xff08;用于与用户交互&#xff09;1.2 文本标签&#xff1a;字体属性1.3 a标签&#…

【动手学习深度学习--逐行代码解析合集】03图像分类数据集

【动手学习深度学习】逐行代码解析合集 03图像分类数据集 视频链接&#xff1a;B站-动手学习深度学习 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 代码 以下代码是在PyCharm中运行的 import matplotlib # 注意这个也要import一…

word整理pdf转换来的文章,或者从网页复制的格式

这是对文章的格式整理。 1、去除 分节符 首先&#xff0c;用格式工厂或者别的pdf转换器等&#xff0c;都会出现为了保持原有格式不变因此增加分节符的情况 添加分节符后&#xff0c;即使这一页还有很大的空白&#xff0c;下一段也会另起一页 而且&#xff0c;单纯的backspa…

Java+控制台实现员工信息管理系统

Java控制台实现员工信息管理系统 一、系统介绍二、功能展示1.主页2.添加员工3.员工列表4.根据员工号查询信息5.根据员工号删除信息6.根据员工号调整员工工资7.退出系统 四、其它1.其他系统实现2.获取源码 一、系统介绍 使用ArrayList对完成一个员工管理系统&#xff0c;员工信…

Flutter 实现任意控件拖动

文章目录 前言一、如何实现&#xff1f;1、使用GestureDetector响应拖动事件2、使用Transform变换控件位置3、计算拖动区域 二、完整代码三、使用示例1、基本用法 总结 前言 使用flutter开发是需要控件能拖动&#xff0c;比如画板中的元素&#xff0c;或者工具条&#xff0c;搜…

chatgpt赋能python:用Python进行数据挖掘来优化SEO排名

用Python进行数据挖掘来优化SEO排名 您是否一直在为如何在搜索引擎排名上优化自己的网站而苦恼&#xff1f;事实上&#xff0c;Python可以成为您的得力助手&#xff0c;来简化您的分析和优化过程&#xff0c;并帮助您在搜索引擎排名上获得更好的结果。 什么是SEO&#xff1f;…