使用@property

作者 新城 日期 2017-08-27
使用@property




既能检查参数,又可以用类似属性这样简单的方式来访问类的变量

1
2
3
4
5
6
7
8
9
10
11
class Student(object):

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

可以在set_score时候对分数进行设置 对于不合理的分数进行过滤 比较繁琐

Python内置的@property装饰器就是负责把一个方法变成属性调用的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

#如果这样定义的话
s.score = 99 #我们还是可以这样调用 同时也对该属性加上了一定的限制效果

装饰器可以给函数动态添加功能,对于类的方法 装饰器也起一定作用 @property装饰器就是负责把一个方法变成属性调用的

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

还可以定义只读属性,只定义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
def birth(self, value):
self._birth = value

@property
def age(self):
return 2015 - self._birth