python使用@property @x.setter @x.deleter

 转载自 http://blog.csdn.net/sxingming/article/details/52916249


@property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。

1》只有@property表示 只读
2》同时有@property和@x.setter表示 可读可写

3》同时有@property和@x.setter和@x.deleter表示可读可写可删除

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class student(object):  #新式类  
  2.     def __init__(self,id):    
  3.         self.__id=id    
  4.     @property  #读    
  5.     def score(self):    
  6.         return self._score    
  7.     @score.setter #写    
  8.     def score(self,value):    
  9.         if not isinstance(value,int):    
  10.             raise ValueError('score must be an integer!')      
  11.         if value<0 or value>100:    
  12.             raise ValueError('score must between 0 and 100')     
  13.         self._score=value    
  14.     @property #读(只能读,不能写)    
  15.     def get_id(self):    
  16.         return self.__id    
  17.     
  18. s=student('123456')    
  19. s.score=60 #写    
  20. print s.score #读    
  21. #s.score=-2 #ValueError: score must between 0 and 100    
  22. #s.score=32.6 #ValueError: score must be an integer!    
  23. s.score=100 #写    
  24. print s.score #读    
  25. print s.get_id #读(只能读,不可写)  
  26. #s.get_id=456 #只能读,不可写:AttributeError: can't set attribute  

运行结果:
60
100
123456

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class A(object):#新式类(继承自object类)  
  2.     def __init__(self):  
  3.         self.__name=None  
  4.     def getName(self):  
  5.         return self.__name  
  6.     def setName(self,value):  
  7.         self.__name=value  
  8.     def delName(self):  
  9.         del self.__name  
  10.     name=property(getName,setName,delName)  
  11.   
  12. a=A()  
  13. print a.name #读  
  14. a.name='python' #写  
  15. print a.name #读  
  16. del a.name #删除  
  17. #print a.name #a.name已经被删除 AttributeError: 'A' object has no attribute '_A__name'  
运行结果:
None
python

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class A(object):#要求继承object  
  2.     def __init__(self):  
  3.         self.__name=None  
  4.       
  5.     #下面开始定义属性,3个函数的名字要一样!  
  6.     @property #读  
  7.     def name(self):  
  8.         return self.__name  
  9.     @name.setter #写  
  10.     def name(self,value):  
  11.         self.__name=value  
  12.     @name.deleter #删除  
  13.     def name(self):  
  14.         del self.__name  
  15.       
  16. a=A()  
  17. print a.name #读  
  18. a.name='python'  #写  
  19. print a.name #读  
  20. del a.name #删除  
  21. #print a.name # a.name已经被删除 AttributeError: 'A' object has no attribute '_A__name'    
运行结果:
None
python

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class person(object):  
  2.     def __init__(self,first_name,last_name):  
  3.         self.first_name=first_name  
  4.         self.last_name=last_name  
  5.     @property #读  
  6.     def full_name(self):  
  7.         return '%s %s' % (self.first_name,self.last_name)   
  8.   
  9. p=person('wu','song')  
  10. print p.full_name #读  
  11. #p.full_name='song ming' #只读,不可修改  AttributeError: can't set attribute    
  12. p.first_name='zhang'  
  13. print p.full_name #读  
运行结果:
wu song
zhang song
上面都是以新式类为例子,下面我们看一个包含经典类的例子:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #!/usr/bin/env python  
  2. #coding:utf-8  
  3.   
  4. class test1:#经典类:没有继承object      
  5.     def __init__(self):      
  6.         self.__private='alex 1' #私有属性以2个下划线开头      
  7.     #读私有属性      
  8.     @property      
  9.     def private(self):      
  10.         return self.__private      
  11.     #尝试去写私有属性(对于经典类而言,“写”是做不到的,注意看后边的代码和注释!)    
  12.     @private.setter      
  13.     def private(self,value):      
  14.         self.__private=value     
  15.     #尝试去删除私有属性(对于经典类而言,“删除”也是做不到的,具体看后边的代码和注释!)    
  16.     @private.deleter    
  17.     def private(self):    
  18.         del self.__private    
  19.         
  20. class test2(object):#新式类:继承了object      
  21.     def __init__(self):      
  22.         self.__private='alex 2' #私有属性以2个下划线开头      
  23.     #读私有属性      
  24.     @property      
  25.     def private(self):      
  26.         return self.__private      
  27.     #写私有属性      
  28.     @private.setter      
  29.     def private(self,value):      
  30.         self.__private=value    
  31.     #删除私有属性    
  32.     @private.deleter    
  33.     def private(self):    
  34.         del self.__private    
  35.         
  36. t1=test1()      
  37. #print t1.__private #外界不可直接访问私有属性      
  38. print t1.private #读私有属性  
  39. print t1.__dict__     
  40. t1.private='change 1' #对于经典类来说,该语句实际上是为实例t1添加了一个实例变量private    
  41. print t1.__dict__    
  42. print t1.private #输出刚刚添加的实例变量private    
  43. t1.private='change 2'    
  44. print t1.__dict__    
  45. del t1.private #删除刚刚添加的实例变量private    
  46. print t1.__dict__    
  47. print t1.private #读私有属性  
  48. #del t1.private #无法通过这种方式删除私有属性:AttributeError: test1 instance has no attribute 'private'  
  49. #对于经典类而言,我们无法通过上面的语句,对实例的私有变量__private进行修改或删除!    
  50. print '-------------------------------------------------------'      
  51. t2=test2()      
  52. print t2.__dict__    
  53. print t2.private #继承了object,添加@private.setter后,才可以写      
  54. t2.private='change 2' #修改私有属性      
  55. print t2.__dict__     
  56. print t2.private    
  57. del t2.private #删除私有变量    
  58. #print t2.private #私有变量已经被删除,执行“读”操作会报错:AttributeError: 'test2' object has no attribute '_test2__private'      
  59. print t2.__dict__    
  60. #对于新式类而言,我们可以通过上面的语句,对实例的私有变量__private进行修改或删除    
运行结果:

alex 1
{'_test1__private': 'alex 1'}
{'_test1__private': 'alex 1', 'private': 'change 1'}
change 1
{'_test1__private': 'alex 1', 'private': 'change 2'}
{'_test1__private': 'alex 1'}
alex 1
-------------------------------------------------------
{'_test2__private': 'alex 2'}
alex 2
{'_test2__private': 'change 2'}
change 2
{}

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值