python中@property的作用和getter setter的解释

 更新时间:2020年12月22日 09:54:46   作者:何梦吉他  
这篇文章主要介绍了python中@property的作用和getter setter的解释,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

@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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过数据库对Django进行删除字段和删除模型的操作

    通过数据库对Django进行删除字段和删除模型的操作

    这篇文章主要介绍了通过数据库对Django进行删除字段和删除模型的操作,这里假设我们已经建立了一个名为book的数据模型,需要的朋友可以参考下
    2015-07-07
  • Python 微信之获取好友昵称并制作wordcloud的实例

    Python 微信之获取好友昵称并制作wordcloud的实例

    今天小编就为大家分享一篇Python 微信之获取好友昵称并制作wordcloud的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python中元组,列表,字典的区别

    Python中元组,列表,字典的区别

    Python中,有3种内建的数据结构:列表、元组和字典。那么他们之间有哪些区别呢?下面小编给大家带来了Python中元组,列表,字典的区别,需要的朋友参考下吧
    2017-05-05
  • 对python中执行DOS命令的3种方法总结

    对python中执行DOS命令的3种方法总结

    今天小编就为大家分享一篇对python中执行DOS命令的3种方法总结,具有很好的参考价值,希望对大家有所帮助一起。一起跟随小编过来看看吧
    2018-05-05
  • Autopep8的使用(python自动编排工具)

    Autopep8的使用(python自动编排工具)

    这篇文章主要介绍了Autopep8的使用(python自动编排工具),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python列表常用函数使用详解

    Python列表常用函数使用详解

    这篇文章主要为大家介绍了Python列表常用的一些函数的使用详解,并通过一些简单的案例让大家更快的理解,感兴趣的可以跟随小编一起学习一下
    2021-12-12
  • Django如何判断访问来源是PC端还是手机端

    Django如何判断访问来源是PC端还是手机端

    这篇文章主要介绍了Django如何判断访问来源是PC端还是手机端问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 对python list 遍历删除的正确方法详解

    对python list 遍历删除的正确方法详解

    今天小编就为大家分享一篇对python list 遍历删除的正确方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python查找与排序算法详解(示图+代码)

    python查找与排序算法详解(示图+代码)

    这篇文章主要介绍了python查找与排序算法详解(示图+代码),文章通过二分查找展开主题详细内容,需要的朋友可以参考一下
    2022-07-07
  • Python selenium的安装和下载谷歌浏览器镜像驱动

    Python selenium的安装和下载谷歌浏览器镜像驱动

    Selenium是一个用于web自动化测试的框架,在使用Ajax请求数据的页面中,会出现 sign ,token等密钥,借助使用Selenium框架来实现数据爬取很不错,本文给大家介绍Python selenium的安装和下载谷歌浏览器镜像驱动,需要的朋友可以参考下
    2022-11-11

最新评论