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文档生成工具pydoc使用介绍
Jun 02 Python
python妹子图简单爬虫实例
Jul 07 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
Python实现KNN邻近算法
Jan 28 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
Django开发的简易留言板案例详解
Dec 04 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
python怎么对数字进行过滤
Jul 05 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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/02 日漫
截获网站title标签之家内容的例子
2006/10/09 PHP
php mssql 时间格式问题
2009/01/13 PHP
PHP输入流php://input介绍
2012/09/18 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
JavaScript中的其他对象
2008/01/16 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
Vue.js中的computed工作原理
2018/03/22 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python中map()与zip()操作方法
2016/02/27 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
多个python文件调用logging模块报错误
2020/02/12 Python
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
总经理岗位职责描述
2014/02/08 职场文书
师范生见习报告
2014/10/31 职场文书
2016情人节宣传语
2015/07/14 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
服务器SVN搭建图文安装过程
2022/06/21 Servers