python中@property的作用和getter setter的解释


Posted in Python onDecember 22, 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中@property的作用和getter setter的解释的文章就介绍到这了,更多相关python中@property的作用和getter setter内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python批量生成本地ip地址的方法
Mar 23 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Python unittest模块用法实例分析
May 25 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
python+mysql实现学生信息查询系统
Feb 21 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
python numpy库linspace相同间隔采样的实现
Feb 25 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
地图可视化神器kepler.gl python接口的使用方法
Dec 22 #Python
Python实现Word文档转换Markdown的示例
Dec 22 #Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 #Python
Django中ORM的基本使用教程
Dec 22 #Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 #Python
Python 多进程原理及实现
Dec 21 #Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 #Python
You might like
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
js输出列表实现代码
2010/09/12 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
Jquery Datatables的使用详解
2020/01/30 jQuery
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
python处理multipart/form-data的请求方法
2018/12/26 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
经典c++面试题五
2014/12/17 面试题
2019年c语言经典面试题目
2016/08/17 面试题
六月份红领巾广播稿
2014/02/03 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
读书月活动方案
2014/05/22 职场文书
班级读书活动总结
2014/06/30 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
婚宴父母致辞
2015/07/27 职场文书
门卫管理制度范本
2015/08/05 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android