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 相关文章推荐
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Python列表list排列组合操作示例
Dec 18 Python
python pandas库的安装和创建
Jan 10 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
python 实现多维数组转向量
Nov 30 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
Opencv实现二维直方图的计算及绘制
Jul 21 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在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
javascript multibox 全选
2009/03/22 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python模块学习 datetime介绍
2012/08/27 Python
python字典基本操作实例分析
2015/07/11 Python
Python的requests网络编程包使用教程
2016/07/11 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
电话销售经理岗位职责
2013/12/07 职场文书
班会关于环保演讲稿
2013/12/29 职场文书
期终自我鉴定
2014/02/17 职场文书
国际贸易系求职信
2014/08/09 职场文书
2014年客房部工作总结
2014/11/22 职场文书
教师先进个人材料
2014/12/17 职场文书
党员活动总结
2015/02/04 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python