描述:property() 函数的作用是在新式类中返回属性值。
@property 装饰器简单理解就是负责把一个方法变成属性调用
下面理解property()方法语法:
class property([fget[, fset[, fdel[, doc]]]])
参数:fget-获取属性值的函数;fset-设置属性值的函数;fdel-删除属性值函数;doc-属性描述信息
实例
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
实例化结果:
注:c 是类C的实例化
1、c.x 触发getter;2、c.x = value 触发setter;3、del c.x 触发 deleter
———————————————————— @property ——————————————————————————————
将property 函数用作@property装饰器详解:
getter、setter、deleter方法用作装饰器
1 class C(object): 2 def __init__(self): 3 self._x = None 4 5 @property 6 def x(self): 7 """I'm the 'x' property.""" 8 return self._x 9 10 @x.setter 11 def x(self, value): 12 self._x = value 13 14 @x.deleter 15 def x(self): 16 del self._x
理解以上,下面来考虑实际场景。
在绑定属性时,如果直接把属性暴露出去,写起来简单,但是没有办法检查参数,导致成绩可以随便改变:
s = Student() s.score = 9999 #成绩未做校验
为了限制score范围,通过set_score()方法来设置成绩,再通过get_score()获取成绩,在set_score()里面
检查参数:
1 class Student(object): 2 3 def get_score(self): 4 5 return self._score 6 7 def set_score(self, value): 8 9 if not isinstance(value, int): 10 11 raise ValueError('score must be an integer!') 12 13 if value <0 or value > 100: 14 15 raise ValueError('score must between 0~100 !') 16 17 self._score = value
现在对任意的Student实例进行操作,score就产生了限制:
>>>s = Student() #实例化 >>>s.set_score(60) >>>s.get_score() #执行get获取成绩 60 >>>s.set_score(9999)#执行set方法校验 Traceback (most recent call last): ... ValueError: score must between 0 ~ 100!
以上为常规方法实现,下面应用Python内置的@property装饰器负责把一个方法变成属性调用:
1 class Student(object): 2 3 @property 4 def score(self): #加上@property 把getter方法变成属性 5 return self._score 6 7 @score.setter # 加上@score.setter 把setter方法变成属性赋值 8 def score(self, value): 9 10 if not isinstance(value, int): 11 raise ValueError('score must be an integer!') 12 13 if value < 0 or value > 100: 14 raise ValueError('score must between 0 ~ 100!') 15 16 self._score = value 17
可控属性操作:
1 >>>s =Student() 2 >>>s.score = 60 #属性赋值操作,实际转化为s.set_score(60) 3 >>>s.score #获取属性操作,实际转化为s.get_score() 4 60 5 >>> s.score = 9999 6 Traceback (most recent call last): 7 ... 8 ValueError: score must between 0 ~ 100!
注意这个@property,我们在对实例属性操作时,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现。
可以定义只读属性,只定义getter方法,不一定setter方法就是一个只读属性:
1 class Student(object): 2 3 @property 4 def birth(self): 5 return self._birth 6 7 @birth.setter 8 def birth(self, value): 9 self._birth = value 10 11 @property 12 def age(self): 13 return 2015 - self._birth
birth 是可读可写属性,age是只读属性
注:额外函数的名字和property下的一样。
到此,整个property装饰器理解结束,写进博客做记录。
本次资料源自:
廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000
菜鸟教程:
http://www.runoob.com/python/python-func-property.html