一、property
1. 函数的作用
在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样。
class Rectangle(object):
def __init__(self):
self.width =10
self.height=20
r=Rectangle()
print(r.width,r.height)
此时输出结果为10 20
但是这样在实际使用中会产生一个严重的问题,__init__
中定义的属性是可变的,换句话说,是使用一个系统的所有开发人员在知道属性名的情况下,可以进行随意的更改(尽管可能是在无意识的情况下),但这很容易造成严重的后果。
对于这种情况,我们可以使用python的内置函数property来解决。
property 可以用于以下场景:
将方法定义为属性
: 例如,您可以将一个计算属性定义为只读属性,以便其他代码可以访问该属性的值,但不能修改该属性的值。控制属性的访问
: 例如,您可以将一个密码属性定义为只写属性,以便其他代码只能设置该属性的值,但不能读取该属性的值。验证属性值
: 例如,您可以将一个年龄属性定义为只写属性,并验证该属性的值必须大于 0。缓存属性值
: 例如,您可以将一个数据库连接属性定义为只读属性,并缓存该属性的值,以避免重复创建数据库连接。删除属性值
2. property函数
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:
s = Student()
s.score = 9999
这显然不合逻辑,任何人都可以对该变量进行修改,且修改的内容不受限制。
为了限制score的范围,可以通过一个set_score()
方法来设置成绩,再通过一个get_score()
来获取成绩,这样,在set_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:
raise ValueError('score must between 0 ~ 100!')
self._score = value
现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:
>>> s = Student(