前言

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 # zs.set_age(20)
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 # age = property(age)
def age(self):
return self.__age

@age.setter # age = age.setter(age)
def age(self, value):
if 6<=value<=18:
self.__age = value
else:
raise Exception("年纪过大,不接收该学生")

zs = Student("张三", 18)
zs.age = 10
print(zs.age)

上述代码即常规使用办法,前三种是演变过程;该规范代码记住即可,或者使用快捷键props+回车即可调出框架;