MyPython-->进阶篇-->@property

为了防止直接把属性暴漏出去,我们通过set_score() get_score方法。但是调用略显复杂,有没有技能检查参数又可以用类似属性这样简单的方式来访问类的变量呢  @property

类似装饰器我们只需要在函数定义的签名加上@property

class Studentt():
    @property
    def score(self):
        return self._score
    @score.setter
    def score(self,value):
        if not isinstance(value, int):
            raise ValueError('int ')
        if value<0 or value>100:
            raise ValueError('0->100')
        self._score = value
ic = Studentt()
ic.score = 20

@property的实现比较复杂,我们先考察如何使用,把一个getter方法变成属性,只需要加上@proprerty就可以了,此时@property又创建了一个装饰器@score.setter 负责把一个setter方法变成属性赋值,于是我们就拥有一个可控的属性操作

我们还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性

class Studenta():
    @property
    def birth(self):
        return self._birth
    @birth.setter
    def birth(self,birth):
        self._birth  = birth
    @property
    def age(self):
        return 2015-self._birth
sca = Studenta()
sca.birth = 1993
print(sca.age)

 

posted @ 2016-09-14 12:35  notJoke  阅读(194)  评论(0编辑  收藏  举报