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使用forms来实现评论功能
Aug 17 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
Python中实现switch功能实例解析
Jan 11 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
python的time模块和datetime模块实例解析
Nov 29 Python
大数据分析用java还是Python
Jul 06 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
python判断一个变量是否已经设置的方法
Aug 13 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
php array_slice函数的使用以及参数详解
2008/08/30 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
python利用高阶函数实现剪枝函数
2018/03/20 Python
python 字典访问的三种方法小结
2019/12/05 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
2019史上最全Database工程师题库
2015/12/06 面试题
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
外贸专业求职信
2014/03/09 职场文书
行政人事岗位职责
2014/03/17 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
《画风》教学反思
2014/04/16 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
浅析Python实现DFA算法
2021/06/26 Python
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android