python中@property的作用和getter setter的解释


Posted in Python onDecember 22, 2020

@property作用:

python的@property是python的一种装饰器,是用来修饰方法的。

我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。

1.修饰方法,让方法可以像属性一样访问。

class DataSet(object):
 @property
 def method_with_property(self): ##含有@property
   return 15
 def method_without_property(self): ##不含@property
   return 15

l = DataSet()
print(l.method_with_property) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
print(l.method_without_property()) #没有加@property , 必须使用正常的调用方法的形式,即在后面加()#两个都输出为15。

如果使用property进行修饰后,又在调用的时候,方法后面添加了(), 那么就会显示错误信息:TypeError: 'int' object is not callable,也就是说添加@property 后,这个方法就变成了一个属性,如果后面加入了

(),那么就是当作函数来调用,而它却不是callable(可调用)的。

2.与所定义的属性配合使用,这样可以防止属性被修改。

由于python进行属性的定义时,没办法设置私有属性,因此要通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。

class DataSet(object):
  def __init__(self):
    self._images = 1
    self._labels = 2 #定义属性的名称
  @property
  def images(self): #方法加入@property后,这个方法相当于一个属性,这个属性可以让用户进行使用,而且用户有没办法随意修改。
    return self._images 
  @property
  def labels(self):
    return self._labels
l = DataSet()
#用户进行属性调用的时候,直接调用images即可,而不用知道属性名_images,因此用户无法更改属性,从而保护了类的属性。
print(l.images) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。

getter和setter方法:

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

class Student(object):

  @property
  def score(self):
    return self._score

  @score.setter
  def score(self, value):
    if not isinstance(value, int):
      raise ValueError('score must be an integer!')
    if value < 0 or value > 100:
      raise ValueError('score must between 0 ~ 100!')
    self._score = value

我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student(object):

  @property
  def birth(self):
    return self._birth

  @birth.setter #设置属性
  def birth(self, value):
    self._birth = value

  @property
  def age(self):
    return 2015 - self._birth

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。

小结

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

到此这篇关于python中@property的作用和getter setter的解释的文章就介绍到这了,更多相关python中@property的作用和getter setter内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
关于Python正则表达式 findall函数问题详解
Mar 22 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 Python
python计算二维矩形IOU实例
Jan 18 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
python实现电子词典
Mar 03 Python
Python如何将装饰器定义为类
Jul 30 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
地图可视化神器kepler.gl python接口的使用方法
Dec 22 #Python
Python实现Word文档转换Markdown的示例
Dec 22 #Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 #Python
Django中ORM的基本使用教程
Dec 22 #Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 #Python
Python 多进程原理及实现
Dec 21 #Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 #Python
You might like
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
Python测试线程应用程序过程解析
2019/12/31 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
高中生活自我鉴定
2014/01/18 职场文书
有创意的广告词
2014/03/18 职场文书
贷款承诺书范文
2014/05/19 职场文书
经济管理专业求职信
2014/06/09 职场文书
办护照工作证明
2014/10/01 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书