Python @property原理解析和用法实例


Posted in Python onFebruary 11, 2020

这篇文章主要介绍了Python @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 #@score.setter是前一个@property装饰后的副产品。
  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实现2014火车票查询代码分享
Jan 10 Python
Python中endswith()函数的基本使用
Apr 07 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
浅谈python可视化包Bokeh
Feb 07 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
python 二维数组90度旋转的方法
Jan 28 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
如何使用Python发送HTML格式的邮件
Feb 11 #Python
python模式 工厂模式原理及实例详解
Feb 11 #Python
Python3搭建http服务器的实现代码
Feb 11 #Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 #Python
python线程join方法原理解析
Feb 11 #Python
使用Python求解带约束的最优化问题详解
Feb 11 #Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 #Python
You might like
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php中文验证码实现方法
2015/06/18 PHP
php和html的区别点详细总结
2019/09/24 PHP
javascript 节点遍历函数
2010/03/28 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
JS删除数组里的某个元素方法
2018/02/03 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
使用Python对Access读写操作
2017/03/30 Python
pandas 时间格式转换的实现
2019/07/06 Python
python各类经纬度转换的实例代码
2019/08/08 Python
python FTP编程基础入门
2021/02/27 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
食堂标语大全
2014/06/11 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书