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小技巧分享
Nov 22 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
Python金融数据可视化汇总
Nov 17 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
python 文件查找及内容匹配方法
Oct 25 Python
python reverse反转部分数组的实例
Dec 13 Python
Python中按键来获取指定的值
Mar 02 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 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 header函数使用教程
2013/09/05 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python常用特殊方法实例总结
2019/03/22 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
PyQt5实现登录页面
2020/05/30 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
Structs界面控制层技术
2013/10/11 面试题
初一体育教学反思
2014/01/29 职场文书
会计岗位职责范本
2014/03/07 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
社团活动总结报告
2014/06/27 职场文书
财会专业大学生求职信
2014/09/26 职场文书