公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员时可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。属性结合了公开数据成员和成员方法的有点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活地访问。
1 class Test():
2 def __init__(self,value):
3 self.__value = value #私有数据成员
4
5 @property #修饰器,定义属性,提供对私有数据成员的访问
6 def value(self): #这样就定义了一个只读属性,只读属性无法修改值和删除
7 return self.__value
8
9 if __name__ == '__main__':
10 t = Test(3)
11
12 t.v = 5 #为实例动态增加新成员
13 del t.v #动态删除成员
14 del t.value #试图删除对象属性,会报错的
15
16 '''
17 Traceback (most recent call last):
18 File "C:/Users/dddd/PycharmProjects/untitled5/test1.py", line 14, in <module>
19 del t.value #试图删除对象属性,会报错的
20 AttributeError: can't delete attribute
21 '''
下面的代码则把属性设置为可读、可修改,而不允许删除。
1 class Test:
2
3 def __init__(self,value):
4 self.__value = value
5
6 def __get(self): #读取私有数据成员的值
7 return self.__value
8
9 def __set(self,v): #设置私有数据成员的值
10 self.__value = v
11
12 value = property(__get,__set) #可读可写属性,指定相应的读写方法
13
14 def show(self):
15 print(self.__value)
16
17
18
19 if __name__ == '__main__':
20 t = Test(3)
21 t.value #允许读取属性值
22 t.value = 5 #允许修改属性值
23 t.show() #属性对应的私有变量也得到了相应的修改
24 del t.vaue #试图删除属性,但会报错
当然,也可以将属性设置为可读、可修改、可删除。
1 class Test: 2 3 def __init__(self,value): 4 self.__value = value 5 6 def __get(self): #读取私有数据成员的值 7 return self.__value 8 9 def __set(self,v): #设置私有数据成员的值 10 self.__value = v 11 12 def __del(self): #删除对象的私有数据成员 13 del self.__value 14 15 value = property(__get,__set,__del) #可读可写可删除属性,指定相应的读写删除方法 16 17 def show(self): 18 print(self.__value) 19 20 21 22 if __name__ == '__main__': 23 t = Test(3) 24 t.value #允许读取属性值 25 t.value = 5 #允许修改属性值 26 t.show() #属性对应的私有变量也得到了相应的修改 27 del t.value #这样就能删除实例的私有数据成员 28 29 t.value = 1 #为对象动态增加属性和对应私有数据成员 30 t.show() 31 t.value