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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
Python读取键盘输入的2种方法
Jun 16 Python
python编程开发之日期操作实例分析
Nov 13 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python中is与==判断的区别
Mar 28 Python
Python编程实现的图片识别功能示例
Aug 03 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
python使用turtle库绘制时钟
Mar 25 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
python ubplot使用方法解析
Jan 10 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
详解python中groupby函数通俗易懂
May 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
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
jquery日历控件实现方法分享
2014/03/07 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
Django实现学员管理系统
2019/02/26 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
python 连续不等式语法糖实例
2020/04/15 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
.NET面试题:什么是反射
2016/09/30 面试题
经典导游欢迎词大全
2014/01/16 职场文书
寄语学生的话
2014/04/10 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
齐云山导游词
2015/02/06 职场文书
教导主任个人总结
2015/03/03 职场文书
毕业论文致谢范文
2015/05/14 职场文书
党员理论学习心得体会
2016/01/21 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers