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实现堆栈与队列的方法
Jan 15 Python
python实现端口转发器的方法
Mar 13 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
详解用Python实现自动化监控远程服务器
May 18 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python:动态路由的Flask程序代码
Nov 22 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 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反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
php简单分页类实现方法
2015/02/26 PHP
JS event使用方法详解
2008/04/28 Javascript
javascript 浏览器检测代码精简版
2010/03/04 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
原生js实现购物车
2020/09/23 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python写日志文件操作类与应用示例
2019/07/01 Python
用python写测试数据文件过程解析
2019/09/25 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
请说出以下代码输出什么
2013/08/30 面试题
感恩父母的演讲稿
2014/05/06 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android