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 相关文章推荐
在Windows8上的搭建Python和Django环境
Jul 03 Python
理解Python垃圾回收机制
Feb 12 Python
利用python画一颗心的方法示例
Jan 31 Python
python读取文件名称生成list的方法
Apr 27 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
用Python开发app后端有优势吗
Jun 29 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
Python图像处理之图像拼接
Apr 28 Python
python中的3种定义类方法
Nov 27 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
一个PHP日历程序
2006/12/06 PHP
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
JavaScript实现全选取消效果
2017/12/14 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
详解Vue.js 响应接口
2020/07/04 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
Python部署web开发程序的几种方法
2017/05/05 Python
Python切片工具pillow用法示例
2018/03/30 Python
python的中异常处理机制
2018/08/30 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
经典大学生求职信范文
2014/01/06 职场文书
公司股权转让协议书
2014/04/12 职场文书
公开承诺书格式
2014/05/21 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
瘦西湖导游词
2015/02/03 职场文书
北京导游词
2015/02/12 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis