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抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
python魔法方法-自定义序列详解
Jul 21 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
python实现NB-IoT模块远程控制
Jun 20 Python
numpy添加新的维度:newaxis的方法
Aug 02 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
python TCP包注入方式
May 05 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 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 extension 加载顺序问题
2019/08/16 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
python检测远程端口是否打开的方法
2015/03/14 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python如何使用unittest测试接口
2018/04/04 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python Numpy库datetime类型的处理详解
2019/07/13 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
python 命名规范知识点汇总
2020/02/14 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
python退出循环的方法
2020/06/18 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
村党支部公开承诺书
2014/05/29 职场文书
新兵入伍心得体会
2014/09/04 职场文书
优秀高中学生评语
2014/12/30 职场文书
顶岗实习计划书
2015/01/16 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang