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链接Oracle数据库的方法
Jun 28 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
Django接收自定义http header过程详解
Aug 23 Python
对python中各个response的使用说明
Mar 28 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
详解Python设计模式之策略模式
Jun 15 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/06 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
javascript模拟命名空间
2015/04/17 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
p5.js绘制旋转的正方形
2019/10/23 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
python实现的分层随机抽样案例
2020/02/25 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
Final类有什么特点
2012/04/25 面试题
健康状况证明模板
2014/10/23 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
法院执行局工作总结
2015/08/11 职场文书
企业愿景口号
2015/12/25 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
如何用python绘制雷达图
2021/04/24 Python
python 离散点图画法的实现
2022/04/01 Python
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL