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的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
深入理解Python爬虫代理池服务
Feb 28 Python
python pycurl验证basic和digest认证的方法
May 02 Python
python实现趣味图片字符化
Apr 30 Python
python2和python3在处理字符串上的区别详解
May 29 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
Python datetime 如何处理时区信息
Sep 02 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实现简单爬虫的开发
2016/03/28 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
Python程序员开发中常犯的10个错误
2014/07/07 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
《童年的发现》教学反思
2014/02/14 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
行政申诉状范文
2015/05/20 职场文书
运动会广播稿50字
2015/08/19 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python