Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171626
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-13 17:05
文章分类

全部博文(31)

文章存档

2016年(11)

2015年(20)

我的朋友

分类: LINUX

2016-01-13 11:14:48


  1. In [22]: class student:
  2.     def getscore(self):
  3.         return self.score
  4.     def setscore(self,value):
  5.         if not isinstance(value,int):
  6.             raise ValueError('score must be an integer!')
  7.         elif value < 0 or value > 100:
  8.             raise ValueError('score must between 0-100!')
  9.         self.score = value
  10.    ....:

  11. In [23]: s = student()

  12. In [24]: s.setscore(60)

  13. In [25]: s.getscore()
  14. Out[25]: 60
以上这个实例,建立一个student类,这个类中有两个方法:getscore和setscore

setscore 方法:参数为score 作为值赋予变量 self.score
getscore 方法: 直接返回 self.score

将student类实例化为 s , 调用 setscore方法给参数赋值,在调用 getscore方法返回赋值

上面这个操作调用方法过于复杂,没有属性来的直接简单。

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?使用python内置的property装饰器就可以做到把一个方法变成属性调用的。

修改上面类:

  1. In [54]: class student(object):
  2.     @property
  3.     def score(self):
  4.         return self._score
  5.     @score.setter
  6.     def score(self,value):
  7.         if not isinstance(value,int):
  8.             raise ValueError('muse be num!')
  9.         if value < 0 or value > 100:
  10.             raise ValueError('must be 0~100!')
  11.         self._score = value
  12.    ....:

  13. In [55]: s = student()

  14. In [56]: s.score = 19

  15. In [57]: print s.score
  16. 19

  17. In [58]: s.score = 101
  18. ---------------------------------------------------------------------------
  19. ValueError Traceback (most recent call last)
  20. <ipython-input-58-84f4bf77cd8e> in <module>()
  21. ----> 1 s.score = 101

  22. <ipython-input-54-52de4c55bf21> in score(self, value)
  23.       8 raise ValueError('muse be num!')
  24.       9 if value < 0 or value > 100:
  25. ---> 10 raise ValueError('must be 0~100!')
  26.      11 self._score = value
  27.      12

  28. ValueError: must be 0~
把一个getter方法变成属性,只需要加上@property就可以了,此时@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。

在看一个实例:
  1. In [38]: class test(object):
  2.    ....: def __init__(self):
  3.    ....: self.__x = None
  4.    ....: def getx(self):
  5.    ....: return self.__x
  6.    ....: def setx(self,value):
  7.    ....: self.__x = value
  8.    ....: def delx(self):
  9.    ....: del self.__x

该类中存在三个方法: getx() 、setx() 、delx()    通过@property 改下这三个方法为属性,代码如下:
  1. In [58]: class test(object):
  2.     def __init__(self):
  3.         self.__x = None
  4.     @property
  5.     def x(self):
  6.         return self.__x
  7.     @x.setter
  8.     def x(self,value):
  9.         self.__x = value
  10.     @x.deleter
  11.     def x(self):
  12.         del self.__x
  13.    ....:

  14. In [59]: abc = test()

  15. In [60]: abc.x = 'hello'

  16. In [61]: print abc.x
  17. hello

  18. In [62]: del abc.x
统一属性的三个方法名要一致。

property函数原型:property(fget=None,fset=None,fdel=None,doc=None)
阅读(1578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~