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 输出一个两行字符的变量
Feb 05 Python
pandas数值计算与排序方法
Apr 12 Python
便捷提取python导入包的属性方法
Oct 15 Python
python从入门到精通 windows安装python图文教程
May 18 Python
python列表,字典,元组简单用法示例
Jul 11 Python
详解python statistics模块及函数用法
Oct 27 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
Jan 12 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
Python3开发环境搭建详细教程
Jun 18 Python
python dict如何定义
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简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
php实现小程序支付完整版
2018/10/09 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
python获取代理IP的实例分享
2018/05/07 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python实现排序算法解析
2018/09/08 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
绝对经典成功的大学生推荐信
2013/11/08 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
共青团员自我评价范文
2014/09/14 职场文书
捐款感谢信
2015/01/20 职场文书