python @propert装饰器使用方法原理解析


Posted in Python onDecember 25, 2019

这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问。propert可以有两种用法:可以把一个方法变成只读属性;可以对一些属性进行过滤。

想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会报错,为了避免这种情况,可以有两种方法解决。

一:设置一个方法,对属性值进行判断:

class Student():

  def get_score(self):
    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.set_score(value="88")  print(s.get_score())

再Student类中,为了避免直接对 _score 属性操作,我们提供了 get_score 和 set_score 方法,这样起到了封装的作用,把一些不想对外公开的属性隐蔽起来,而只是提供方法给用户操作,在方法里面,我们可以检查参数的合理性等。这样做没什么问题,但是我们有更简单的方式来做这件事。

二:使用propert装饰器。

class Teacher():
  @property
  def score(self):
    return self._score

  @score.setter
  def 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__':

  t = Teacher()
  t.score = 10
  print(t.score)
  t.score = 20
  print(t.score)

在上面,我们给方法 score 加上了 @property,于是我们可以把 score 当成一个属性来用,此时,又会创建一个新的装饰器 score.setter,它可以把被装饰的方法变成属性来赋值。

另外,我们也不一定要使用 score.setter 这个装饰器,这时 score 就变成一个只读属性了:

class test():
  def __init__(self, s1):
    self.s = s1

  @property
  def f1(self):
    return self.s

if __name__ == '__main__':

  t1 = test(s1=90)
  print(t1.f1)

注意:最后面一行的print(t1.f1)不要加括号,print(t1.f1()),要不会报错'int' object is not callable

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python迭代器的使用方法实例
Nov 21 Python
python中cPickle用法例子分享
Jan 03 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
Django中Model的使用方法教程
Mar 07 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
python os.fork() 循环输出方法
Aug 08 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
python 消除 futureWarning问题的解决
Dec 25 #Python
提升python处理速度原理及方法实例
Dec 25 #Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 #Python
将python包发布到PyPI和制作whl文件方式
Dec 25 #Python
python几种常用功能实现代码实例
Dec 25 #Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 #Python
python 实现list或string按指定分段
Dec 25 #Python
You might like
php正则表达式(regar expression)
2011/09/10 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python中拆分字符串的操作方法
2019/07/23 Python
python同时替换多个字符串方法示例
2019/09/17 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
应届生煤化工求职信
2013/10/21 职场文书
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
高中自我评价分享
2013/12/05 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
中学教师培训制度
2014/01/31 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
投资意向书
2014/07/30 职场文书
安全施工责任书
2014/08/25 职场文书
设备收款委托书范本
2014/10/02 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
python周期任务调度工具Schedule使用详解
2021/11/23 Python