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实现的数据结构与算法之链表详解
Apr 22 Python
Python3 socket同步通信简单示例
Jun 07 Python
替换python字典中的key值方法
Jul 06 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
详解python常用命令行选项与环境变量
Feb 20 Python
Python接收手机短信的代码整理
Aug 02 Python
python类共享变量操作
Sep 03 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 Python
Python打包exe时各种异常处理方案总结
May 18 Python
七个非常实用的Python工具包总结
Jun 15 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编程开发“虚拟域名”系统
2006/10/09 PHP
关于Intype一些小问题的解决办法
2008/03/28 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
javascript的几种写法总结
2016/09/30 Javascript
Vue响应式原理详解
2017/04/18 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
python读取注册表中值的方法
2013/04/08 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
关于python多重赋值的小问题
2019/04/17 Python
python迭代器常见用法实例分析
2019/11/22 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
《自然之道》教学反思
2014/02/11 职场文书
房屋继承公证书
2014/04/10 职场文书
植树节新闻稿
2015/07/17 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis