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 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
详解Python中的各种函数的使用
May 24 Python
浅析Python中signal包的使用
Nov 13 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
Python设计模式之门面模式简单示例
Jan 09 Python
python requests.post带head和body的实例
Jan 02 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
最新pycharm安装教程
Nov 18 Python
python热力图实现的完整实例
Jun 25 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
建立动态的WML站点(三)
2006/10/09 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
拖动时防止选中
2017/02/03 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
python和C语言混合编程实例
2014/06/04 Python
python机器人运动范围问题的解答
2019/04/29 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
深入浅析Python中的迭代器
2019/06/04 Python
pandas计数 value_counts()的使用
2019/06/24 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python银行系统实战源码
2019/10/25 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
个人安全承诺书
2014/05/22 职场文书
学前班学生评语
2014/12/29 职场文书
复兴之路观后感
2015/06/02 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers