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计算圆周长、面积、球体体积并画出圆
Apr 08 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
python+pygame简单画板实现代码实例
Dec 13 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
python中seaborn包常用图形使用详解
Nov 25 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
Python用来做Web开发的优势有哪些
Aug 05 Python
Python获取百度热搜的完整代码
Apr 07 Python
如何使用PyCharm及常用配置详解
Jun 03 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中获取系统信息的方法
2013/06/25 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
求职简历中的自我评价分享
2013/12/08 职场文书
会计学专业求职信
2014/07/17 职场文书
授权委托书
2014/07/31 职场文书
安全第一课观后感
2015/06/18 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
Python入门之基础语法详解
2021/05/11 Python
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript