Python中@property的理解和使用示例


Posted in Python onJune 11, 2019

本文实例讲述了Python中@property的理解和使用。分享给大家供大家参考,具体如下:

重看狗书,看到对User表定义的时候有下面两行

@property
  def password(self):
    raise AttributeError('password is not a readable attribute')
  @password.setter
  def password(self, password):
    self.password_hash = generate_password_hash(password)

遂重温下这个property的使用

在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property闪亮登场啦,巴拉巴拉能量……..

用代码来举例子更容易理解,比如一个学生成绩表定义成这样

class Student(object):
  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

我们调用的时候需要这么调用:

>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):
 ...
ValueError: score must between 0 ~ 100!

但是为了方便,节省时间,我们不想写s.set_score(9999)啊,直接写s.score = 9999不是更快么,加了方法做限制不能让调用的时候变麻烦啊,@property快来帮忙….

class Student(object):
  @property
  def score(self):
    return self._score
  @score.setter
  def score(self,value):
    if not isinstance(value, int):
      raise ValueError('分数必须是整数才行呐')
    if value < 0 or value > 100:
      raise ValueError('分数必须0-100之间')
    self._score = value

看上面代码可知,把get方法变为属性只需要加上@property装饰器即可,此时@property本身又会创建另外一个装饰器@score.setter,负责把set方法变成给属性赋值,这么做完后,我们调用起来既可控又方便

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
 ...
ValueError: score must between 0 ~ 100!

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 中random模块的常用方法总结
Jul 08 Python
python 读写中文json的实例详解
Oct 29 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
Python FTP两个文件夹间的同步实例代码
May 25 Python
python删除本地夹里重复文件的方法
Nov 19 Python
python得到单词模式的示例
Oct 15 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
教你用python控制安卓手机
May 13 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 #Python
详解Python3之数据指纹MD5校验与对比
Jun 11 #Python
Python自动抢红包教程详解
Jun 11 #Python
python解压TAR文件至指定文件夹的实例
Jun 10 #Python
python pyinstaller 加载ui路径方法
Jun 10 #Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 #Python
python处理“
Jun 10 #Python
You might like
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
js setTimeout 常见问题小结
2013/08/13 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
Python中的集合介绍
2019/01/28 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
班组长的岗位职责
2013/12/09 职场文书
家长会主持词开场白
2014/03/18 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
储备店长岗位职责
2015/04/14 职场文书
防汛通知
2015/04/25 职场文书
2015年小学体育工作总结
2015/05/22 职场文书