python中,我们可以直接添加和修改属性的值:

  1. >>> class Student(object):
  2. ... pass
  3. ...
  4. >>> s = Student()
  5. >>> s.score = 101

但是,101明显超过了满分100分,不合理。可以通过创建setScore()方法,进行参数检查:

  1. >>> class Student(object):
  2. ... def setScore(self,score):
  3. ... if not isinstance(score,int):
  4. ... raise ValueError('分数必须是一个整数')
  5. ... if score < 0 or score > 100:
  6. ... raise ValueError('分数值必须在0到100之间')
  7. ... self.score = score
  8. ... def getScore(self):
  9. ... return self.score
  10. ...
  11. >>> s = Student()
  12. >>> s.setScore(200)
  13. Traceback (most recent call last):
  14. File "<stdin>", line 1, in <module>
  15. File "<stdin>", line 6, in setScore
  16. ValueError: 分数值必须在0100之间
  17. >>> s.setScore(99)
  18. >>> s.getScore()
  19. 99

但是上面的过程略显复杂。

这时,可以使用@property,既可以用类似属性的方法访问类的变量,又可以检查参数,@property实现起来稍微有点复杂:

  1. >>> class Student(object):
  2. ... @property
  3. ... def score(self):
  4. ... return self._score
  5. ... @score.setter
  6. ... def score(self,score):
  7. ... if not isinstance(score,int):
  8. ... raise ValueError('必须是整数')
  9. ... if score < 0 or score > 100:
  10. ... raise ValueError('必须在0到100之间')
  11. ... self._score = score
  12. ...
  13. >>> s = Student()
  14. >>> s.score = 88
  15. >>> s.score = 55
  16. >>> s.score = 101
  17. Traceback (most recent call last):
  18. File "<stdin>", line 1, in <module>
  19. File "<stdin>", line 10, in score
  20. ValueError: 必须在0100之间

把一个getter方法变成属性,只需要加上@property即可,同时,@property本身又创建了另外一个装饰器@score.setter,该装饰器负责把一个setter方法变成属性赋值。

另外,只定义getter方法,不定义setter方法就是在定义一个只读属性:

  1. >>> class Student(object):
  2. ... @property
  3. ... def birth(self):
  4. ... return self._birth
  5. ... @birth.setter
  6. ... def birth(self,birth):
  7. ... self._birth = birth
  8. ... @property
  9. ... def age(self):
  10. ... return 2018 - self._birth
  11. ...
  12. >>> s =Student()
  13. >>> s.birth = 1991
  14. >>> s.birth
  15. 1991
  16. >>> s.age
  17. 27
  18. >>> s.age = 20
  19. Traceback (most recent call last):
  20. File "<stdin>", line 1, in <module>
  21. AttributeError: can't set attribute

最后一步,证明了age只是一个只读属性!

Python面向对象-@property装饰器的更多相关文章

  1. Python的property装饰器的基本用法

    Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...

  2. python中@property装饰器的使用

    目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...

  3. [转载]Python使用@property装饰器--getter和setter方法变成属性

    原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...

  4. 【python】@property装饰器

    Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式.在很多场合下,这是一种非常有用的机制. class ...

  5. Python 利用@property装饰器和property()方法将一个方法变成属性调用

    在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_s ...

  6. Python之property装饰器

    参考: http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035600.html http://joy2everyone.iteye.com/ ...

  7. python面向对象:组合、封装、property装饰器、多态

    一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...

  8. 面向对象之封装 及@property装饰器使用

    目录 封装 1.封装的定义 2.封装的目的: 3.封装的三种方式 4.封装的优点 5.访问限制(封装) @property 装饰器 属性property底层实现 封装 1.封装的定义 将复杂的丑陋的, ...

  9. python中面向对象之装饰器

    python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...

随机推荐

  1. Python3 之 列表推导式

    列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表. 它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句.那个表达式可以是任意的, ...

  2. day 13 生成器函数 表达式 推导式

    今日主要内容 1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换 2. 生成器函数: 函数中包含了yield ...

  3. Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  4. 微服务与Spring Cloud概述

    微服务与Spring Cloud随着互联网的快速发展, 云计算近十年也得到蓬勃发展, 企业的IT环境和IT架构也逐渐在发生变革,从过去的单体应用架构发展为至今广泛流行的微服务架构. 微服务是一种架构风 ...

  5. Linux集群介绍、keepalived介绍及配置高可用集群

    7月3日任务 18.1 集群介绍18.2 keepalived介绍18.3/18.4/18.5 用keepalived配置高可用集群扩展heartbeat和keepalived比较http://blo ...

  6. DS1302时钟芯片驱动程序

    /***************************************************************************** FileName : DS1302.c F ...

  7. 转:SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)

    开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...

  8. [TimLinux] django 下载功能中文文件名问题

    from django.utils.encoding import escape_uri_pathfrom django.http import HttpResponse def download(r ...

  9. nbuoj2786 玻璃球

    题目:http://www.nbuoj.com/v8.83/Problems/Problem.php?pid=2786 用2个玻璃球找到从一100层的大楼的某一层落下刚好会摔碎,如何制定最优策略? 别 ...

  10. poj3111 K Best 最大化平均值,二分

    题目:http://poj.org/problem?id=3111 题意:给你n,k,n个数的v.w值,选出k个数,使得v之和/w之和最大化. 思路:一看到题目,这不是赤果果的贪心吗?为什么放在二分专 ...