Python中的@property、@x.setter、@x.deleter装饰器

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

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

1》只有@property表示只读。

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

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


 
 
  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. s=student( '123456')
  18. s.score= 60 #写
  19. print s.score #读
  20. #s.score=-2 #ValueError: score must between 0 and 100
  21. #s.score=32.6 #ValueError: score must be an integer!
  22. s.score= 100 #写
  23. print s.score #读
  24. print s.get_id #读(只能读,不可写)
  25. #s.get_id=456 #只能读,不可写:AttributeError: can't set attribute

运行结果:
60
100
123456


 
 
  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. a=A()
  12. print a.name #读
  13. a.name= 'python' #写
  14. print a.name #读
  15. del a.name #删除
  16. #print a.name #a.name已经被删除 AttributeError: 'A' object has no attribute '_A__name'
运行结果:
None
python


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


 
 
  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. p=person( 'wu', 'song')
  9. print p.full_name #读
  10. #p.full_name='song ming' #只读,不可修改 AttributeError: can't set attribute
  11. p.first_name= 'zhang'
  12. print p.full_name #读
运行结果:
wu song
zhang song
上面都是以新式类为例子,下面我们看一个包含经典类的例子:


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

余额充值