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求素数示例分享
Feb 16 Python
Python中的getopt函数使用详解
Jul 28 Python
python基础教程之匿名函数lambda
Jan 17 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
python远程邮件控制电脑升级版
May 23 Python
python学生信息管理系统实现代码
Dec 17 Python
python实现ip地址的包含关系判断
Feb 07 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
基于python实现查询ip地址来源
Jun 02 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
Python时间操作之pytz模块使用详解
Jun 14 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数据库开发知多少
2006/10/09 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
vue 配置多页面应用的示例代码
2018/10/22 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
项目合作协议书
2014/04/16 职场文书
法制宣传教育方案
2014/05/09 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
总经理检讨书
2014/09/15 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
mysql全面解析json/数组
2022/07/07 MySQL
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技