@property
是内置的装饰器,与普通装饰器原理是同样的,只不过返回的不是函数,而是类对象.@property
负责把一个方法变成属性进行调用,保证对参数进行必要的检查。setter
、getter
、deleter
。当属性只有getter
方法,则为只有只读属性。不然为可读写属性。定义一个类:函数
class Student(object): def __init__(self,score): self.__score = score ## __score 翻译成 _Student__score # 容许外部代码获取score def get_score(self): print('%s'%self.__score) return self.__score
上述例子中,在绑定属性的时候,直接把属性暴露出去,致使能够随意修改,可是对score的修改又没有作校验限制等。
为了限制属性,例如score的范围,能够经过一个set_score()方法来设置成绩,再经过一个get_score()来获取成绩。
例如:翻译
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: # 输入的int数据,判断输入的范围 raise ValueError('score must between 0 -100 ') self.score = value
试运行:code
>>> s = Student() # 不须要s=Student(60),由于没有init方法 >>> s.set_score (60) >>> s.get_score() 60 >>> s.set_score(101) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 8, in set_score ValueError: score must between 0 -100
因此,有没有既能检查参数,又能够用相似属性这样简单的方式来访问、判断类的变量呢?
是否还记得装饰器decorator
能够给函数动态加上功能?对于类的方法,装饰器同样起做用。对象
使用规则:get
例如:it
class Student(object): # score:可读可写属性, getter与setter方法 # 把一个getter方法变成属性,只须要加上@property就能够了 @property def score(self): return self._score # 建立另外一个装饰器@score.setter,负责把一个setter方法变成属性赋值 @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 # 定义只读属性,只定义getter方法 @property def age(self): return self._age
❤ thanks for watching, keep on updating...
点个赞再走吧ast