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检测某个变量是否有定义的方法
May 20 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
关于Django外键赋值问题详解
Aug 13 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
python获取服务器响应cookie的实例
Dec 28 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 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中获取url与物理路径的总结
2013/06/21 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
PHP解析RSS的方法
2015/03/05 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
再探JavaScript作用域
2014/09/24 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
详解webpack babel的配置
2018/01/09 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
django 自定义用户user模型的三种方法
2014/11/18 Python
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
详谈python http长连接客户端
2017/06/12 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
赡养老人协议书
2014/04/21 职场文书
重阳节标语大全
2014/10/07 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
小马王观后感
2015/06/11 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA