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中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
Python中splitlines()方法的使用简介
May 20 Python
JSON Web Tokens的实现原理
Apr 02 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
python调用百度REST API实现语音识别
Aug 30 Python
详解用Python练习画个美队盾牌
Mar 23 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python字符串拼接+和join的区别详解
Dec 03 Python
python空元组在all中返回结果详解
Dec 15 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 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学习笔记 数组的常用函数
2011/06/13 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
详解python eval函数的妙用
2017/11/16 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
python实现关键词提取的示例讲解
2018/04/28 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
python实现代码审查自动回复消息
2021/02/01 Python
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
C语言开发工程师测试题
2016/12/20 面试题
技术总监岗位职责
2013/12/05 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
医学生自荐信范文
2015/03/05 职场文书
八年级作文之友情
2019/11/25 职场文书