为了防止直接把属性暴漏出去,我们通过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)