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运行的17个时新手常见错误小结
Aug 07 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
python读取文本绘制动态速度曲线
Jun 21 Python
python爬取网易云音乐评论
Nov 16 Python
简单了解python变量的作用域
Jul 30 Python
Python csv模块使用方法代码实例
Aug 29 Python
python自动识别文本编码格式代码
Dec 26 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
详解python中的异常和文件读写
Jan 03 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无限分类的深入理解
2013/06/02 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
完善的jquery处理机制
2016/02/21 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python 实现简单的电话本功能
2015/08/09 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
群众路线党课主持词
2014/04/01 职场文书
运动会横幅标语
2014/06/17 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
初三语文教学计划
2015/01/22 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
logback如何自定义日志存储
2021/08/30 Java/Android
SQL Server内存机制浅探
2022/04/06 SQL Server
Windows server 2012搭建FTP服务器
2022/04/29 Servers