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 正则式 概述及常用字符
May 07 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python3处理HTTP请求的实例
May 10 Python
python判断完全平方数的方法
Nov 13 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
Python的缺点和劣势分析
Nov 19 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
简单介绍django提供的加密算法
Dec 18 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
常用的10个Python实用小技巧
Aug 10 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
仿百度联盟对联广告实现代码
2014/08/30 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python实现随机选择元素功能
2017/09/14 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
如何使用python操作vmware
2019/07/27 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
python代码实现猜拳小游戏
2020/11/30 Python
详解Python模块化编程与装饰器
2021/01/16 Python
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
c++工程师面试问题
2013/08/04 面试题
物业管理毕业生个人的求职信
2013/11/30 职场文书
求职自荐信
2013/12/14 职场文书
管道维修工岗位职责
2013/12/27 职场文书
机关节能减排实施方案
2014/03/17 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
电力培训心得体会
2014/09/02 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
教师个人成长总结
2015/02/11 职场文书
主持人大赛开场白
2015/05/29 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书