property 应用场景
需要限制对象属性的设置和获取。比如学生分数为只读,或者在设置学生分数的时候有范围限制
property() 参数
property()的语法为:
property(fget=None, fset=None, fdel=None, doc=None)
- fget(可选) -用于获取属性值的方法。默认为
None
。 - fset(可选) -用于设置属性值的方法。默认为
None
。 - fdel(可选) -用于删除属性值的方法。默认为
None
。 - doc(可选) -是属性描述信息。如果省略,会把
fget
方法的docstring
拿来用(如果有的话)。默认为None
。
property()的返回值
property()
从指定的getter,setter和deleter返回property
属性。
- 如果没有指定任何参数,则
property()
返回的基本property
属性不包含任何getter、setter或Deleter。 - 如果未提供doc,
property()
则使用getter函数的docstring。
示例1:使用getter,setter和deleter创建属性
class Score(object):
"""
使用property的第一种方式,property()
"""
def __init__(self, score):
self._score = score
def get_score(self):
print('get_score() called')
return self._score
def set_score(self, score):
print('set_score() called, score set to ' + str(score))
self._score = score
def del_score(self):
print('del_score() called, score is deleted')
del self._score
score = property(get_score, set_score, del_score, "Score Property")
if __name__ == '__main__':
s = Score(60)
s.score = 80 # 设置值会调用set_score()
print(s.score) # 获取值会调用get_score()
del s.score # 删除值会调用del_score()
运行结果:
set_score() called, score set to 80
get_score() called
80
del_score() called, score is deleted
示例2:使用@property装饰器
@property
语法糖提供了比 property()
函数更简洁直观的写法。
- 被
@property
装饰的方法是获取属性值的方法,被装饰方法的名字会被用做属性名
。 - 被
@属性名.setter
装饰的方法是设置属性值的方法。 - 被
@属性名.deleter
装饰的方法是删除属性值的方法。
class Score2:
"""
使用property的第2种方式,使用property装饰器
"""
def __init__(self, score):
self._score = score
@property
def score(self):
print('Getting score')
return self._score
@score.setter
def score(self, score):
print('Setting score to ' + str(score))
self._score = score
@score.deleter
def score(self):
print('Deleting score')
del self._score
if __name__ == '__main__':
s = Score2(60)
s.score = 80 # 获取值会调用score
print(s.score) # 设置值会调用@score.setter
del s.score # 删除值会调用@score.deleter
运行结果:
Setting score to 80
Getting score
80
Deleting name
注意,我们使用了具有不同定义的相同方法score()
来定义getter,setter和deleter。
无论何时使用s.score
,它都会在内部调用适当的getter,setter和deleter,如显示的打印输出所示。