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

1
2
3
4
5
6
7
8
9
10
11
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方法变成属性赋值,于是,我
们就拥有一个可控的属性操作:

1
2
3
4
5
6
7
8
>>> 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 ,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过gett
er和setter方法来实现的。
还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
class  Student( object ):
     @ property
     def  birth( self ):
         return  self ._birth
     @birth.setter          #设置了set和get方法
     def  birth( self , value):
         self ._birth  =  value
     @ property             #设置了get方法
     def  age( self ):
         return  2014  -  self ._birth
c = Student()
c.birth = 10 ;
print  c.age
1
2
3
4
D:\chinaUnicom\Chinese\python.exe D: / python / test1 / test3.py
2004
 
Process finished with exit code  0