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的迭代器和生成器
Jul 29 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
Jun 20 Python
Python多重继承的方法解析执行顺序实例分析
May 26 Python
Python变量类型知识点总结
Feb 18 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
python跳出双层for循环的解决方法
Jun 24 Python
pymysql的简单封装代码实例
Jan 08 Python
python pptx复制指定页的ppt教程
Feb 14 Python
python 插入日期数据到Oracle实例
Mar 02 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
Python如何根据时间序列数据作图
May 12 Python
Python pysnmp使用方法及代码实例
Aug 24 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
让PHP支持断点续传的源码
2010/05/16 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
Python unittest单元测试框架总结
2018/09/08 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
小组名称和口号
2014/06/09 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
内科护士节演讲稿
2014/09/11 职场文书
大学生见习报告范文
2014/11/03 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
采购员工作总结范文
2015/08/12 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL