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的加密模块md5、sha、crypt使用实例
Sep 28 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
Python标准库shutil用法实例详解
Aug 13 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
Python自动化测试笔试面试题精选
Mar 12 Python
python函数调用,循环,列表复制实例
May 03 Python
基于Python的Jenkins的二次开发操作
May 12 Python
keras 权重保存和权重载入方式
May 21 Python
python简单实现9宫格图片实例
Sep 03 Python
Python破解极验滑动验证码详细步骤
May 21 Python
Python Pandas常用函数方法总结
Jun 15 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 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制作静态网站的模板框架(四)
2006/10/09 PHP
PHP安全配置
2006/12/06 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
使用python模拟高斯分布例子
2019/12/09 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
彻底解决Python包下载慢问题
2020/11/15 Python
Python下载的11种姿势(小结)
2020/11/18 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
python爬虫如何解决图片验证码
2021/02/14 Python
接口的多继承会带来哪些问题
2015/08/17 面试题
自我评价优秀范文分享
2013/11/30 职场文书
报关报检委托书
2014/04/08 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
小人国观后感
2015/06/11 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers
python 判断文件或文件夹是否存在
2022/03/18 Python