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的Django框架中if标签的相关使用
Jul 15 Python
Python list操作用法总结
Nov 10 Python
Python3实现的简单验证码识别功能示例
May 02 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
python实现统计文本中单词出现的频率详解
May 20 Python
python找出一个列表中相同元素的多个索引实例
Jun 11 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
Django 构建模板form表单的两种方法
Jun 14 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
Python获取浏览器窗口句柄过程解析
Jul 25 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
Zend的AutoLoad机制介绍
2012/09/27 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
利用php输出不同的心形图案
2016/04/22 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
javascript中Function类型详解
2015/04/28 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
深入理解Python3中的http.client模块
2017/03/29 Python
使用Python对SQLite数据库操作
2017/04/06 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
纬创Java面试题笔试题
2014/10/02 面试题
运动会入场词200字
2014/02/15 职场文书
局火灾防控工作方案
2014/05/25 职场文书
中职生求职信
2014/07/01 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
起诉书格式范文
2015/05/20 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS