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中Flask框架简单入门实例
Mar 21 Python
python实现SMTP邮件发送功能
Jun 16 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
python3中eval函数用法使用简介
Aug 02 Python
flask框架自定义url转换器操作详解
Jan 25 Python
关于python中的xpath解析定位
Mar 06 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
python 如何上传包到pypi
Dec 24 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
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
js实现随机点名小功能
2017/08/17 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
python模块之paramiko实例代码
2018/01/31 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
python实现Virginia无密钥解密
2019/03/20 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
安全员岗位职责
2013/11/11 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
入党现实表现材料
2014/12/23 职场文书
接待员岗位职责范本
2015/04/15 职场文书
开场白怎么写
2015/06/01 职场文书
婚庆主持词大全
2015/06/30 职场文书
员工考勤管理制度
2015/08/06 职场文书
java版 联机五子棋游戏
2022/05/04 Java/Android