本文对python的property做个简单总结。
我们可以把property看做一个类,主要用来实现可管理性built-in数据类型,并且可以用于实现__get__(), __set__(), __del__()的类。
1. 代码简洁,更加易读
2. 更加方便灵活的实现类属性的管理
property的属性及用法:
proprety(fget=None, fset=None, fdel=None, doc=None)
实例剖析:
1. 先看一个不用property的类:
class studentScore(object):
def __init__(self,score=60):
self.score = score
def get_score(self):
return self.score
ins1 = studentScore()
print ins1.get_score()
ins1.score = 100
print ins1.get_score()
#60
#100
上面这个实例,看到是不是明显有问题?可以通过调用函数的方法来输出score的值,但是实例的score可以随便修改。如果我们不想score被修改,也就是仅仅提供只读属性,那可以怎么做?
class studentScore(object):
def get_score(self):
return self.score
def set_score(self,score):
self.score = score
ins2 = studentScore()
ins2.set_score(100)
print ins2.get_score()
#100
我们看到,上面通过set_score()函数来封装score的设置,这样可以一定程度上避免被串改。或者,也可以这样,下面我们用上proprety,限制更为高效,安全。
class studentScore(object):
def __init__(self,_score=60):
self._score = _score
@property
def score(self):
return self._score
ins3 = studentScore(90)
print ins3.score
#ins3.score = 100 # AttributeError: can't set attribute
这里我们用property包装了,上面例子_score只有只读属性,如果想要去修改score的值,则为报AttributeError的错误
当然正如前面提到,property不仅可以实现__get__() ,还可以实现__set__() , __del__()
下面提供一个完整的实例:
class studentScore(object):
def __init__(self):
self._score = None
@property#读取,返回
def score(self):
return self._score
@score.setter #setter 里面可以做一些约束限制
def score(self,_score):
if not isinstance(_score,int):
raise ValueError('score must be an integer')
if _score < 0 or _score > 100:
raise ValueError('score must between 0~100')
self._score = _score
@score.deleter #删除属性
def score(self):
del self._score
ins1 = studentScore()
ins1.score = 10
print ins1.score + 20
ins1.score = 101 #这里超出0~100范围,会报ValueError
del ins1.score #删除ins1._score这个属性
上面是一个比较完整的preperty应用,我们可以在setter里对属性做一些约束,然后通过只读返回!