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列表去重的二种方法
Feb 14 Python
python进程管理工具supervisor使用实例
Sep 17 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Django权限机制实现代码详解
Feb 05 Python
python实现批量解析邮件并下载附件
Jun 19 Python
BP神经网络原理及Python实现代码
Dec 18 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
Python中拆分字符串的操作方法
Jul 23 Python
Python实用库 PrettyTable 学习笔记
Aug 06 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
使用Pycharm分段执行代码
Apr 15 Python
python中upper是做什么用的
Jul 20 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
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
将json对象转换为字符串的方法
2014/02/20 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
python图片验证码生成代码
2016/07/02 Python
python http基本验证方法
2018/12/26 Python
python简单的三元一次方程求解实例
2020/04/02 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
金融专业个人的自我评价
2013/10/18 职场文书
经济担保书范文
2014/04/02 职场文书
买房委托公证书
2014/04/08 职场文书
政协会议宣传标语
2014/10/09 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
2016新年致辞
2015/08/01 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers