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

s = Student()
s.score = 9999

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

class Student(object):def get_score(self):return self._scoredef 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):@propertydef score(self):return self._score@score.setterdef 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):@propertydef birth(self):return self._birth@birth.setterdef birth(self, value):self._birth = value@propertydef age(self):return 2014 - self._birth

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

小结

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

转载于:https://www.cnblogs.com/hdk1993/p/8016985.html

python @property相关推荐

  1. python property内建函数的介绍

    为什么80%的码农都做不了架构师?>>>    函数property的基本功能就是把类中的方法当作属性来访问,下面以一个有意思的例子介绍一下: 假如有一只猫,它忘了它喜欢吃什么,下面 ...

  2. python property理解

    一般情况下我这样使用property: @property def foo(self):return self._foo# 下面的两个decrator由@property创建 @foo.setter ...

  3. python property作用_python中@property的作用和getter setter的解释

    @property作用: python的@property是python的一种装饰器,是用来修饰方法的. 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同 ...

  4. python property函数_Python内置函数property()如何使用

    代码 class Shuxing(): def __init__(self, size = 10): self.size = size def getSize(self): print('getSiz ...

  5. Python·@property属性

    一.property属性 property属性可以用来给属性添加约束,比如温度属性,我们不允许低于-273度:成绩属性,我们不允许0分以下等等.而且使用property属性,将来修改约束条件的时候也很 ...

  6. Python property函数:定义属性

    如果为 Python 类定义了 getter.setter 等访问器方法,则可使用 property() 函数将它们定义成属性(相当于实例变量). property() 函数的语法格式如下: prop ...

  7. Python @property 详解

    Python 有一个概念叫做 property,它能让你在 Python 的面向对象编程中轻松不少.在了解它之前,我们先看一下为什么 property 会被提出. 一个简单的例子 比如说你要创建一个温 ...

  8. Python @property 用法

    本文整理自<Effective Python 编写高质量 Python 代码的 59 个有效方法>第 29 条:用纯属性取代 get 和 set 方法. Python 类 public 属 ...

  9. python @property

    @property 可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的,我们视具体情况吧 请注意以下代码场景: ...

最新文章

  1. JavaScript为unicode编码转换为中文
  2. matplotlib绘图入门详解
  3. Windows去除快捷箭头
  4. POJ-1195-Mobile phones
  5. synchornized实现原理
  6. 陈纪修老师《数学分析》 第02章:数列极限 笔记
  7. 用BILSTM+CRF模型进行命名实体识别
  8. 微信小程序自带地图_微信小程序 地图(map)实例详解
  9. ei会议论文录用但不参加会议_ei会议论文还能在报纸杂志发表吗?
  10. godaddy无法修改域名服务器,godaddy的DNS A记录不能修改原因
  11. 一堂难忘的计算机课作文,难忘的一节微机课_800字
  12. python编写回文程序上海自来水来自海_回文句式初探:“上海自来水来自海上”...
  13. 微信公众号开发(一)--开发模式与编辑模式
  14. sx1278lora模块的常见问题解答
  15. Python地学分析 — GDAL将多个遥感图像叠加保存为tif文件
  16. 解决Linux命令行前出现base
  17. We‘re sorry but XXX doesn‘t work properly without JavaScript enabled. Please enable it to contin
  18. python爬取虎扑评论_python爬去虎扑数据信息,完成可视化
  19. Processing 入门教程(三十) lerpColor颜色渐变
  20. pentaho-server 与 Pentaho Data Integration(pentaho-kettle)

热门文章

  1. 编写程序,子进程通过管道向父进程发出字符串ok.
  2. 数据文件实验#OCP#
  3. 数据库mysql爆满怎么搞_MySQL 磁盘满了,怎么办??
  4. 家用路由器支持组播吗_组播分布树及其转发模式
  5. SQL Server基础操作(此随笔仅作为本人学习进度记录二)
  6. 大道至简阅读笔记02
  7. 一次上机试题(面向对象)
  8. PHP中对数据库操作的封装
  9. TOPCODER SAM 686 div1 300
  10. 图像检索:几种基于纹理特征的图像检索算法