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多线程实例教程
Sep 06 Python
Python实现对比不同字体中的同一字符的显示效果
Apr 23 Python
Python线程详解
Jun 24 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
Python中if elif else及缩进的使用简述
May 31 Python
Python实现的knn算法示例
Jun 14 Python
python实现知乎高颜值图片爬取
Aug 12 Python
pytorch实现查看当前学习率
Jun 24 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
python 从list中随机取值的方法
Nov 16 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
实用函数9
2007/11/08 PHP
php修改时间格式的代码
2011/05/29 PHP
基于php split()函数的用法详解
2013/06/05 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
js 学习笔记(三)
2009/12/29 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
jQuery技巧总结
2011/01/01 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
javascript常用的设计模式
2017/02/09 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
通过循环优化 JavaScript 程序
2019/06/24 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
Python常用列表数据结构小结
2014/08/06 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
python面试题之列表声明实例分析
2019/07/08 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
服装设计专业自荐信
2014/06/17 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
中学生自我评价范文
2015/03/03 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
决心书格式及范文
2019/06/24 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL