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入门者的一些编程建议
Jun 15 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
python简单实例训练(21~30)
Nov 15 Python
python实现壁纸批量下载代码实例
Jan 25 Python
python3调用R的示例代码
Feb 23 Python
Python3 单行多行万能正则匹配方法
Jan 07 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
python中with用法讲解
Feb 07 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
Python爬虫之Selenium库的使用方法
Jan 03 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
python中Pexpect的工作流程实例讲解
Mar 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多任务程序实例解析
2014/07/19 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
大学校园生活自我鉴定
2014/01/13 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
同步小康驻村工作简报
2015/07/20 职场文书