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的Django框架中simple-todo工具的简单使用
May 30 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
python万年历实现代码 含运行结果
May 20 Python
python编程培训 python培训靠谱吗
Jan 17 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
python变量命名的7条建议
Jul 04 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
NumPy统计函数的实现方法
Jan 21 Python
用python 绘制茎叶图和复合饼图
Feb 26 Python
Python实现Hash算法
Mar 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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
php文件系统处理方法小结
2016/05/23 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Python只用40行代码编写的计算器实例
2017/05/10 Python
《Python学习手册》学习总结
2018/01/17 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
如何基于Python实现自动扫雷
2020/01/06 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
酒店公关部经理岗位职责
2013/11/24 职场文书
事业单位接收函
2014/01/10 职场文书
建筑项目策划书
2014/01/13 职场文书
财经学院自荐信范文
2014/02/02 职场文书
七一讲话心得体会
2014/09/05 职场文书
个人股份合作协议书
2014/10/24 职场文书
php引用传递
2021/04/01 PHP
Python实现科学占卜 让视频自动打码
2022/04/09 Python