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中datetime常用时间处理方法
Jun 15 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
flask-restful使用总结
Dec 04 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python线程中的同步问题及解决方法
Aug 29 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
python中复数的共轭复数知识点总结
Dec 06 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
python绘制汉诺塔
Mar 01 Python
python3 字符串str和bytes相互转换
Mar 23 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
在php MYSQL中插入当前时间
2008/04/06 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
往光标所在位置插入值的js代码
2013/09/22 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
python使用Berkeley DB数据库实例
2014/09/26 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python数组复制拷贝的实现方法
2015/06/09 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
python如何从文件读取数据及解析
2019/09/19 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
会计员岗位职责
2014/03/15 职场文书
庆祝儿童节标语
2014/10/09 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书