首页 > 编程语言 > 详细

python修改内部属性参数值(@property、@setter和@deleter 装饰器)

时间:2021-07-22 16:50:06      阅读:22      评论:0      收藏:0      [点我收藏+]
python中@property、@setter和@deleter 装饰器
 
通常我们写代码的时候,都不希望外部代码能够轻易地修改内部属性的参数
 
因为要在外部改变参数的时候,我们必须想办法通过内部函数去检验参数的正确性,以确保设置正确
 
但是我们不让外部轻易地修改数据,反过来我们自己也不能很方便地从外部获取数据
 
那么,怎么样才能既在外部轻易地修改数据,又能很方便地获取到数据呢??
 
下面请看代码:
 
class Student():
 
def __init__(self): # 初始化
self._score = None
 
def get_score(self): # 获得成绩
return self._score
 
def set_score(self, value): # 设置成绩,并判断是否符合要求
if value < 0 or value > 100:
raise ValueError(‘score must between 0 ~ 100!‘)
self._score = value
 
if __name__ == "__main__":
s = Student()
 
 
_score(单“_”)完全可以看成是一个私有变量名,因为在模块与类外无法调用它
 
在这程序里我们不管设置成绩或者获取成绩,都得用最傻的办法,当然,我们也不能设置不合理的成绩值
 
如下图:
 
 
 
 
 
 
 
我们如果想直接把score绑定为Student的一个属性,方便来调用和赋值的话,就得这么修改:
 
class Student():
 
def __init__(self):
self._score = None
 
def get_score(self):
return self._score
 
def set_score(self, value):
if value < 0 or value > 100:
raise ValueError(‘score must between 0 ~ 100!‘)
self._score = value
 
score = property(get_score, set_score) # 将方法变为属性
 
if __name__ == "__main__":
s = Student()
 
这时,我们确实可以操作s.score来操作内部的数据了
 
 
 
 
 
其实我们还有另外一种更好的办法,就是把一个getter变为@property,而@property本身又创建了另一个装饰器,这里是@score.setter,这样getter、setter方法都变为属性可以赋值调用了
 
(getter意为获得者,这里指get_score;setter意为设置者,这里指set_score)
 
 
 
修改后的代码如下:
 
class Student():
 
def __init__(self):
self._score = None
 
@property
def score(self):
return self._score
 
@score.setter
def score(self, value):
if value < 0 or value > 100:
raise ValueError(‘score must between 0 ~ 100!‘)
self._score = value
 
if __name__ == "__main__":
s = Student()
 
 
这个程序里就不用特意写get_score和set_score了,@property已经分配好了,所以我们两个函数都可以叫score
 
这样我们就可以只通过s.score来方便地操作数据了,当然我们依旧不能取范围以外的值
 
 
 
 
 
最后我们再看@deleter,只要再写一个如下的函数,我们就可以通过del s.score来轻松删掉原来的值了
 
@score.deleter
def score(self):
del self._score
 
最后我们总结一下:
 
@property定义只读属性,@setter定义可读可写属性,@deleter定义可读可写可删除属性
 
原文链接:https://blog.csdn.net/weixin_41656968/article/details/80286238
————————————————

python修改内部属性参数值(@property、@setter和@deleter 装饰器)

原文:https://www.cnblogs.com/changjiang520/p/15044019.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!