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写的Socks5协议代理服务器
Aug 06 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
Python实现合并字典的方法
Jul 07 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
python解析xml简单示例
Jun 21 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
Python就将所有的英文单词首字母变成大写
Feb 12 Python
使用numpy nonzero 找出非0元素
May 14 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
PHP积分兑换接口实例
2015/02/09 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php给图片加文字水印
2015/07/31 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
Django重设Admin密码过程解析
2020/02/10 Python
函授自我鉴定范文
2014/02/06 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
个人授权委托书格式
2014/08/30 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
综合素质自我评价评语
2015/03/06 职场文书
法定代表人免职证明
2015/06/24 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python