Python中的@property装饰器
2019-02-11 23:37:45来源:博客园 阅读 ()
要了解@property的用途,首先要了解如何创建一个属性。
一般而言,属性都通过__init__方法创建,比如:
1 class Student(object): 2 def __init__(self,name,score): 3 self.name=name 4 self.score=score
创建实例,运行结果:
1 tim=Student('Tim',97) 2 tim.score=100 3 tim.score 4 100 5 mary=Student('Mary',90) 6 mary.score 7 90
但是这样子有2个坏处:
1.__init__ 中定义的属性是可变的,如果一个系统的开发人员在知道属性名的情况下,就可以进行随意更改(尽管可能是在无意识的情况下),如果一不小心篡改了,后台排查很难!
2.不利于进行参数检查,比如:score属性范围本该是[0,100],但如果输成了1000也不会报错。
因此,一个标准的创建属性流程如下:
1.定义三个跟属性(本例中是score)相关的函数:
get(用于返回score属性)
set(用于设定score属性)
del(用于删除score属性)
在set函数中,可以添加一些取值范围,比如[0,100].此外,为了私有化属性,前面可以加上__。
这样就做到了既能通过创建实例设定属性,又不让开发人员轻易修改score属性。
如下所示:
1 class Student(object): 2 def getScore(self): 3 return self.__score 4 5 def setScore(self,score): 6 if score>100 or score<0: 7 raise ValueError ('score is out of range.') 8 else: 9 self.__score=score 10 11 def delScore(self): 12 del self.__score
这样,一旦score取值不在设定范围内,就会报错!
创建一个实例,能够正常运行:
1 Mary=Student() 2 Mary.setScore(90) 3 Mary.getScore() 4 90
但是,通过方法getScore()查看分数似乎还是有点繁琐,能不能把它当作一个属性去调用呢?至少调用不需要输入()嘛!
当然是可以的。
办法就是通过装饰器:@property
通过给getScore,setScore,delScore三个方法分别添加三个装饰器,就可以直接把这三个方法作为属性去调用了!
如下所示:
1 class Student(object): 2 @property 3 def getScore(self): 4 return self.__score 5 @getScore.setter 6 def setScore(self,score): 7 if score>100 or score<0: 8 raise ValueError ('score is out of range.') 9 else: 10 self.__score=score 11 @getScore.deleter 12 def delScore(self): 13 del self.__score
1 tim=Student() 2 tim.setScore=90 3 tim.getScore 4 90
非常神奇!方法居然变成了属性,为什么呢?
因为装饰器@property本质上是一个property()函数,property()函数也是一个装饰器。
一般的装饰器是用在普通函数上,而@property是用在类内的方法上。
property()函数包含了三个部分:getter,setter,deleter。
因为setter和deleter是property()的第二和第三个参数,不能直接套用@语法。
因此,本质上@property相当于getter部分,@setScore.setter相当于setter部分,@delScore.deleter相当于deleter部分。
所以,上面的代码本质上等价于:
1 class Student(object): 2 def getScore(self): 3 return self.__score 4 5 def setScore(self,score): 6 if score>100 or score<0: 7 raise ValueError ('score is out of range.') 8 else: 9 self.__score=score 10 11 def delScore(self): 12 del self.__score 13 14 score=property(getScore,setScore,delScore,'description')
最后,为了函数名美观,可以把函数名字改成Score():
1 class Student(object): 2 @property 3 def Score(self): 4 return self.__score 5 @Score.setter 6 def Score(self,score): 7 if score>100 or score<0: 8 raise ValueError ('score is out of range.') 9 else: 10 self.__score=score 11 @Score.deleter 12 def delScore(self): 13 del self.__score 14 15 tim=Student() 16 tim.Score=90 17 tim.Score 18 90
几篇个人觉得写的比较清楚的文章:
http://www.runoob.com/python/python-func-property.html
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000
https://www.cnblogs.com/cicaday/p/python-decorator.html
原文链接:https://www.cnblogs.com/szjshuffle/p/10363463.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Django Models
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash