Python @property及getter setter原理详解


Posted in Python onMarch 31, 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 相关文章推荐
Python基础之函数用法实例详解
Sep 10 Python
Python基于twisted实现简单的web服务器
Sep 29 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
python Django批量导入数据
Mar 25 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
python如何查看微信消息撤回
Nov 27 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
python对XML文件的操作实现代码
Mar 27 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
Nov 17 Python
在python中实现导入一个需要传参的模块
May 12 Python
关于Django Models CharField 参数说明
Mar 31 #Python
Django Serializer HiddenField隐藏字段实例
Mar 31 #Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 #Python
Python3 hashlib密码散列算法原理详解
Mar 30 #Python
django xadmin action兼容自定义model权限教程
Mar 30 #Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 #Python
Django admin 实现search_fields精确查询实例
Mar 30 #Python
You might like
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
python处理csv数据的方法
2015/03/11 Python
python添加模块搜索路径方法
2017/09/11 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
Pycharm中如何关掉python console
2020/10/27 Python
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
新学期班主任寄语
2014/01/18 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
2015年科协工作总结
2015/05/19 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers