Python动态属性有什么用

Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下。

先看一个简单的例子。创建一个 Student 类,我希望通过实例来获取每个学生的一些情况,包括名字,成绩等。成绩只有等到考试结束以后才会有,所以实例化的时候不会给它赋值。

考试完以后,准备给 mike 打分:

在这里,老师一不小心多打了个 9 ,通常来说打分都是 100 分值,999 是一个非法数据,不应该赋值成功。学生一多,老师打分出现手误的情况肯定会越来越多,所以我们必须想办法修改程序,限制 score 的值必须在 0-100 分。

我们定义一个方法,如果输入的不是 0-100 的整数,就让程序报错,数据合法,我们就把 score 属性修改成功。

这样我们每次需要获取成绩的时候使用 self.score 获取,修改成绩的时候调用函数来修改:

调用以后会报错,因为 999 是非法数据。注意,这个时候我使用 self.score 还是可以进行设置,而且不报错:

这显然是不行的。所以我们要提供一种机制,把 score 变成私有属性,不能让外部访问。很遗憾,python 的私有属性是伪私有。通常我们把 ​ ​_​​ 开头的属性叫私有属性,但是这只是一种协议和规定,你看到下划线开头的属性,不要去访问了。你硬要访问,是可以的,python 并不会禁止。

尽管上面的方法实现了该函数,但它改变了属性的使用方式。它通常是这样用的:

[En]

Although the above method implements the function, it changes the way properties are used. It is usually used like this:

  • 统一了调用方式。self.score = 99 的方式,而不是函数调用的方式。
  • ​_score​​ 我们就不直接去使用了。你要用也可以,不建议。
  • 如果我们一个属性只可以读,把 setter 部分注释掉就可以了。

现在我们来完善这个类,添加 birth 属性和年龄属性:

  • birth 和 age 这两个是可以根据一个求出另外一个的。存在数据冗余问题。
  • age 属性这样是有问题的。mike 初始化的时候,age 已经被求出来了,如果我在下一年再去访问 age 属性,那他就是个错误的值。可以通过把 age 设成现在的秒数来验证:

注意,这里不要去设置 @age.setter ,因为他是动态变化的,你修改了会造成数据不一致,它只能作为一个只读属性。

@property 作用和应用场景:

  • @property 优化了属性读取和设置的可读性
  • 需要限制属性的特征;
  • 只读属性。如果属性只能读,不能写,使用起来非常方便。
    [En]

    read-only properties. If the attribute can only be read, not written, it is very convenient to use.*

  • 此属性会根据不断变化的环境动态更改。
    [En]

    this property changes dynamically according to a changing environment.*

我是九柄,公众号【 九柄 】,分享软件测试文章、面试、教程资料,欢迎来看看。

Original: https://blog.51cto.com/u_12188579/5508542
Author: 九柄聊测试
Title: Python动态属性有什么用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/513247/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python图像处理丨带你掌握图像几何变换

    摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实。 本文分享自华为云社区《​​[Python图像处理] 十二.图像几何变换之图像仿射变换、图…

    Python 2023年5月24日
    039
  • 【Web开发】Python实现Web服务器(web2py)

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月3日
    0103
  • SpringMvc请求流程源码解析

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年2月1日
    0124
  • PyTest常用插件安装

    pytest有很多强大的插件. pytest pytest-html(生成html报告的插件) pytest-xdist(多线程运行的插件) pytest-ordering(改变用…

    Python 2023年9月11日
    040
  • 第四章. Pandas进阶—数据导出

    第四章. Pandas进阶 4.7 数据导出 1.导出.xlsx文件 1).语法: DataFrame.to_excel(excel_writer, sheet_name=’She…

    Python 2023年8月8日
    026
  • .NET性能系列文章一:.NET7的性能改进

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月30日
    099
  • flask文件上传注意点

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月5日
    072
  • python报错TypeError: Input z must be 2D, not 3D的解决方法

    目前,在使用python处理一个nc文件绘制一个风场图时,出现了以下报错 虽然图片画出来了,但是很丑而且没有理想的填充颜色! 但是不知道为啥,但是参考画图过程,分析这个其中的Z应该…

    Python 2023年9月4日
    019
  • 微信小程序——云音乐界面

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月26日
    0111
  • pytest(三十二)–自定义用例顺序(pytest-ordering)

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月17日
    0101
  • pandas筛选、修改并实现分类

    虽然学pandas有段时间了,但是真正应用的场合其实很少,大多数功能用excel就已经足够,最近发现wps表格某些功能比 excel还好用,比如筛选重复身份证,wps表格就做得比e…

    Python 2023年8月8日
    031
  • 【python技能树】python简介

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2022年12月23日
    075
  • 一文3000字解析Pytest单元测试框架【保姆级教程】

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月18日
    089
  • 千锋Flask学习笔记

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月3日
    089
  • 尝试阅读理解一份linux shell脚本

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2023年1月31日
    097
  • 【字体反爬】目标站点人人车,Python反爬系列再次更新

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Python 2022年10月6日
    0146
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球