Python @property及getter setter原理详解


Posted in Python onMarch 31, 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 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
Python的组合模式与责任链模式编程示例
Feb 02 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Selenium的使用详解
Oct 19 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
python实现维吉尼亚算法
Mar 20 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
python中元组的用法整理
Jun 15 Python
关于Django Models CharField 参数说明
Mar 31 #Python
Django Serializer HiddenField隐藏字段实例
Mar 31 #Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 #Python
Python3 hashlib密码散列算法原理详解
Mar 30 #Python
django xadmin action兼容自定义model权限教程
Mar 30 #Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 #Python
Django admin 实现search_fields精确查询实例
Mar 30 #Python
You might like
用PHP编程开发“虚拟域名”系统
2006/10/09 PHP
PHP 存取 MySQL 数据库的一个例子
2006/10/09 PHP
php仿QQ验证码的实例分析
2013/07/01 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
Js动态创建div
2008/09/25 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
python之import机制详解
2014/07/03 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
pandas值替换方法
2018/07/10 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
浅析Python迭代器的高级用法
2020/07/16 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
委托书模板
2014/04/04 职场文书
师恩难忘教学反思
2014/04/27 职场文书
学用政策心得体会
2014/09/10 职场文书
八荣八耻演讲稿
2014/09/15 职场文书