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 相关文章推荐
浅谈MySQL中的触发器
May 05 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
Python数据集切分实例
Dec 08 Python
python requests.post带head和body的实例
Jan 02 Python
带你认识Django
Jan 15 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
python绘制随机网络图形示例
Nov 21 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
python怎么调用自己的函数
Jul 01 Python
python 发送get请求接口详解
Nov 17 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
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
PHP中对数据库操作的封装
2006/10/09 PHP
php内存缓存实现方法
2015/01/24 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
简单了解python模块概念
2018/01/11 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
信访工作者先进事迹
2014/01/17 职场文书
司机检讨书
2014/02/13 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
优秀员工演讲稿
2019/06/21 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Python 中 Shutil 模块详情
2021/11/11 Python
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python