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
上例中@property把score.getter变成属性,@property本身又创建了一个另一@score.setter装饰器,负责把一个setter方法变成属性赋值。
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
应用(flask-web):密码散列操作
from werkzeug.security import generate_password_hash, check_password_hash
Class(User):
#...
password_hash=db.Column(db.String(128))
@property
def password(self):
raise AttributeError('密码不可读!')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
计算密码散列值得函数通过名为password的止泻属性实现。设定这个属性的值时,赋值方法(第二个password函数)会调用genterate_password_hash()函数。并把结果赋值给password_hash.试图读取password属性的值会返回错误。因为生成散列值后无法还原成原密码。