为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:
class Student():
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
创建实例
b=Student()
b.set_score(89)
print(b.get_score())

通过装饰器,可以既能检查参数,又可以用类似属性这样简单的方式来访问类的变量。内置的@property装饰器就是负责把一个方法变成属性调用的:
class Student():
@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=90 #实际转化为s.set_score(60)
print(s.score)

@property 还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:
class Student():
@property
def birth(self):
return self._birth
@birth.setter
def birth(self,value):
self._birth=value
@property
def age(self):
return 2015-self._birth
birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。
练习:定义Screen类并设置width和height属性
class Screen():
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@width.setter
def width(self,value):
self._width=value
@height.setter
def height(self,value):
self._height=value
@property
def resolution(self):
return self._height *self._width
w=Screen()
w.width=8
w.height=9
print(w.height)
print(w.resolution)
