前言
property属性可以用来给属性添加约束,保护数据在有效范围内;使用property属性,将来修改约束条件的时候也很方便,可以在代码的调用方式不变的情况下改变结果。
例子:对于学生类有两个实例变量,一个是姓名,一个是年龄;对学生的年龄加以约束,将学生的年龄控制在6-18岁之间,倘若创建的学生对象的年龄不在6-18岁之间,则不接收该学生;
实现上述要求的方法有如下这么几种。
实现方法
方法1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Student: def __init__(self, name="", age=0): self.name = name self.__age = age def get_age(self): return self.__age
def set_age(self,value): if 6<=value<=18: self.__age = value else: raise Exception("年纪过大,不接收该学生")
zs = Student("张三", 800) zs.set_age(20) print(zs.get_age())
|
如上述代码所示:首先将年龄实例变量,私有化,即self.__age = age,类外部则无法访问该实例变量;其次创建两个函数,分别为读取和写入函数:其中读取函数,自动返回年龄的数据值;写入函数,若写入的值不在6-18之间,则不接收该学生,若在6-18之间,则将其数值赋值给年龄实例变量;注意事项:实例变量私有化后的读取和写入,无法通过对象.age或对象.age访问或修改,需通过函数get_age读取,set_age函数写入;
上述代码的缺陷:在创建对象初始化过程中,并不会对年龄进行判断,而是直接赋值;因此即使年龄不在接收范围内,该学生也会被接收;
方法2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Student: def __init__(self, name="", age=0): self.name = name self.set_age(age)
def get_age(self): return self.__age
def set_age(self,value): if 6<=value<=18: self.__age = value else: raise Exception("年纪过大,不接收该学生")
zs = Student("张三", 800) zs.set_age(20) print(zs.get_age())
|
为解决实现方法1中的缺陷,在类初始化过程中,直接让其进入写入年龄函数进行判断:self.set_age(age);注意:此时age实例变量是私有化变量;且zs.age=15并不报错,但并不会将15写入年龄,只能用set_age函数进行写入操作;
上述代码缺陷:在初始化函数中,出现self.set_age(age)这种代码,显得不是那么整齐,但Java语言中是利用这种方法实现的;
方法3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Student: def __init__(self, name="", age=0): self.name = name self.age = age
def get_age(self): return self.__age
def set_age(self,value): if 6 <= value <= 18: self.__age = value else: raise Exception("年纪过大,不接收该学生")
age = property(get_age,set_age)
zs= Student("张三", 15) zs.age = 10 print(zs.age)
|
通过创建与实例变量名称相同的类变量实现此功能:age = property(get_age,set_age);在初始化过程中执行该条self.age = age会自动跳至set_age函数进行写入操作,并且实际存储数据的是私有化变量age;但此时可以通过对象.age对age进行读写操作;
方法4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Student: def __init__(self, name="", age=0): self.name = name self.age = age
@property def age(self): return self.__age
@age.setter def age(self, value): if 6<=value<=18: self.__age = value else: raise Exception("年纪过大,不接收该学生")
zs = Student("张三", 18) zs.age = 10 print(zs.age)
|
上述代码即常规使用办法,前三种是演变过程;该规范代码记住即可,或者使用快捷键props+回车即可调出框架;