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基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python发送告警邮件脚本
Sep 17 Python
使用python画社交网络图实例代码
Jul 10 Python
Python closure闭包解释及其注意点详解
Aug 28 Python
Python partial函数原理及用法解析
Dec 11 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
Python递归函数特点及原理解析
Mar 04 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
通过实例解析python and和or使用方法
Nov 14 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 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
zend api扩展的php对象的autoload工具
2011/04/18 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
JS验证字符串功能
2017/02/22 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
python可视化text()函数使用详解
2020/02/11 Python
Python爬取梨视频的示例
2021/01/29 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
2014年应届大学生自我评价
2014/01/09 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
有关打架的检讨书
2014/01/25 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
党支部三会一课计划
2014/09/24 职场文书
首席执行官观后感
2015/06/03 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js