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 splitlines使用技巧
Sep 06 Python
Python判断Abundant Number的方法
Jun 15 Python
python简单文本处理的方法
Jul 10 Python
Python科学计算之Pandas详解
Jan 15 Python
Django入门使用示例
Dec 12 Python
用Python实现数据的透视表的方法
Nov 16 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
如何在Python中妥善使用进度条详解
Apr 05 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抓即时股票信息
2006/10/09 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
取得父标签
2006/11/14 Javascript
javascript数组组合成字符串的脚本
2021/01/06 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python处理JSON数据并生成条形图
2016/08/05 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Python读取表格类型文件代码实例
2020/02/17 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
python中如何设置代码自动提示
2020/07/15 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
python爬取天气数据的实例详解
2020/11/20 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
联谊会主持词
2014/03/26 职场文书
护士医德医风自我评价
2014/09/15 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis