介绍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的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python制作爬虫采集小说
Oct 25 Python
python Tkinter版学生管理系统
Feb 20 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
Apache部署Django项目图文详解
Jul 30 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
python学生管理系统的实现
Apr 05 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
python常见的占位符总结及用法
Jul 02 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
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHP多进程编程实例详解
2017/07/19 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
深入分析JSONP跨域的原理
2014/12/10 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python文件选择对话框的操作方法
2019/06/27 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
Python partial函数原理及用法解析
2019/12/11 Python
python怎么提高计算速度
2020/06/11 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
哈弗商学院毕业生求职信
2014/02/26 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python