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 运算符 供重载参考
Jun 11 Python
python中实现php的var_dump函数功能
Jan 21 Python
八大排序算法的Python实现
Jan 28 Python
python如何通过protobuf实现rpc
Mar 06 Python
使用Python对Csv文件操作实例代码
May 12 Python
Python实现字符串匹配的KMP算法
Apr 04 Python
python爬虫模拟浏览器的两种方法实例分析
Dec 09 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
关于Python使用turtle库画任意图的问题
Apr 01 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 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截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
JS匀速运动演示示例代码
2013/11/26 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[36:02]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python socket编程实例详解
2015/05/27 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python实现三维拟合的方法
2018/12/29 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
python获取Pandas列名的几种方法
2019/08/07 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
HTTP状态码详解
2021/03/18 杂记
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
文员自我评价怎么写
2013/09/19 职场文书
中学生打架检讨书
2014/02/10 职场文书
小学科学教学计划
2015/01/21 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
python如何读取和存储dict()与.json格式文件
2022/06/25 Python