介绍Python的@property装饰器的用法


Posted in Python onApril 28, 2015

在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

s = Student()
s.score = 9999

这显然不合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:

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

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:

>>> 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!

但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!

还记得装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的:

class Student(object):

  @property
  def score(self):
    return self._score

  @score.setter
  def 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

@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

>>> 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!

注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student(object):

  @property
  def birth(self):
    return self._birth

  @birth.setter
  def birth(self, value):
    self._birth = value

  @property
  def age(self):
    return 2014 - self._birth

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。
小结

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

Python 相关文章推荐
python sys模块sys.path使用方法示例
Dec 04 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
python交互界面的退出方法
Feb 16 Python
django实现用户注册实例讲解
Oct 30 Python
python有序查找算法 二分法实例解析
Feb 18 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
python opencv通过按键采集图片源码
May 20 Python
python库sklearn常用操作
Aug 23 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 #Python
在Python中使用__slots__方法的详细教程
Apr 28 #Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 #Python
python将文本转换成图片输出的方法
Apr 28 #Python
Python psutil模块简单使用实例
Apr 28 #Python
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 #Python
Python标准库defaultdict模块使用示例
Apr 28 #Python
You might like
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
详解javascript函数的参数
2015/11/10 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
详解react-redux插件入门
2018/04/19 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
JS删除对象中某一属性案例详解
2020/09/08 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
详解django自定义中间件处理
2018/11/21 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
销售会计工作职责
2013/12/02 职场文书
英语专业学生个人求职信范文
2014/01/06 职场文书
开展读书活动总结
2014/06/30 职场文书
小班教师个人总结
2015/02/05 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
四风之害观后感
2015/06/09 职场文书
2016年党建工作简报
2015/11/26 职场文书
英语教学课后反思
2016/02/15 职场文书
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
Golang流模式之grpc的四种数据流
2022/04/13 Golang