4.1.5 属性

  公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员时可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。属性结合了公开数据成员和成员方法的有点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活地访问。

 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

 

posted @ 2018-03-24 09:53  Avention  阅读(277)  评论(0编辑  收藏  举报