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 django集成cas验证系统
Jul 14 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
python绘制圆柱体的方法
Jul 02 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
python 基于opencv去除图片阴影
Jan 26 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生成UTF8文件的方法
2010/05/15 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
深入理解node.js http模块
2018/01/24 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
Python 实现数组相减示例
2019/12/27 Python
自立自强的名人事例
2014/02/10 职场文书
班级安全教育实施方案
2014/02/23 职场文书
安全目标管理责任书
2014/07/25 职场文书
员工团队活动方案
2014/08/28 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
工人先进事迹材料
2014/12/26 职场文书
活动总结书怎么写
2015/05/11 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技