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之折腾一下目录
Oct 24 Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
python自定义时钟类、定时任务类
Feb 22 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
Python实现寻找回文数字过程解析
Jun 09 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
JSONP跨域请求
2017/03/02 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
js实现每日签到功能
2018/11/29 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
Python实现二叉堆
2016/02/03 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
Python微信操控itchat的方法
2019/05/31 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
Python数据正态性检验实现过程
2020/04/18 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
党员个人公开承诺书
2014/08/29 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL
mysql数据库实现设置字段长度
2022/06/10 MySQL