python @propert装饰器使用方法原理解析

 更新时间:2019年12月25日 11:15:26   作者:梁十安  
这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问。propert可以有两种用法:可以把一个方法变成只读属性;可以对一些属性进行过滤。

想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会报错,为了避免这种情况,可以有两种方法解决。

一:设置一个方法,对属性值进行判断:

class Student():

  def get_score(self):
    return self._score

  def set_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  
if __name__ == '__main__':  s = Student()  s.set_score(value="88")  print(s.get_score())

再Student类中,为了避免直接对 _score 属性操作,我们提供了 get_score 和 set_score 方法,这样起到了封装的作用,把一些不想对外公开的属性隐蔽起来,而只是提供方法给用户操作,在方法里面,我们可以检查参数的合理性等。这样做没什么问题,但是我们有更简单的方式来做这件事。

二:使用propert装饰器。

class Teacher():
  @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
if __name__ == '__main__':

  t = Teacher()
  t.score = 10
  print(t.score)
  t.score = 20
  print(t.score)

在上面,我们给方法 score 加上了 @property,于是我们可以把 score 当成一个属性来用,此时,又会创建一个新的装饰器 score.setter,它可以把被装饰的方法变成属性来赋值。

另外,我们也不一定要使用 score.setter 这个装饰器,这时 score 就变成一个只读属性了:

class test():
  def __init__(self, s1):
    self.s = s1

  @property
  def f1(self):
    return self.s

if __name__ == '__main__':

  t1 = test(s1=90)
  print(t1.f1)

注意:最后面一行的print(t1.f1)不要加括号,print(t1.f1()),要不会报错'int' object is not callable

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python+logging+yaml实现日志分割

    python+logging+yaml实现日志分割

    这篇文章主要为大家详细介绍了python+logging+yaml实现日志分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python的类实例属性访问规则探讨

    Python的类实例属性访问规则探讨

    这篇文章主要介绍了Python的类实例属性访问规则,本文总结了一些对C++和Java程序员来说不是很直观的地方来说明Python中的类实例属性访问,需要的朋友可以参考下
    2015-01-01
  • Python MySQLdb模块连接操作mysql数据库实例

    Python MySQLdb模块连接操作mysql数据库实例

    这篇文章主要介绍了Python MySQLdb模块连接操作mysql数据库实例,本文直接给出操作mysql代码实例,包含创建表、插入数据、插入多条数据、查询数据等内容,需要的朋友可以参考下
    2015-04-04
  • Python 操作 MongoDB 讲解详细

    Python 操作 MongoDB 讲解详细

    MongoDB是一款开源的、基于分布式的、面向文档存储的非关系型数据库。拥有高性能、高可用,易扩展的优点,并且支持丰富的查询语言来支持读写操作以及更复杂的查询等。接下来我们来看一下如何使用Python操作MongoDB数据库
    2021-09-09
  • Python编程调用百度API实现地理位置经纬度坐标转换示例

    Python编程调用百度API实现地理位置经纬度坐标转换示例

    这篇文章主要介绍了Python编程调用百度API来实现地理位置经纬度坐标转换的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • python实现发送邮件

    python实现发送邮件

    这篇文章主要为大家详细介绍了python实现发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • python 利用栈和队列模拟递归的过程

    python 利用栈和队列模拟递归的过程

    这篇文章主要介绍了python 利用栈和队列模拟递归的过程,文中并通过两段代码给大家介绍了下递归和非递归的区别,需要的朋友可以参考下
    2018-05-05
  • python制作小说爬虫实录

    python制作小说爬虫实录

    本文给大家介绍的是作者所写的第一个爬虫程序的全过程,从构思到思路到程序的编写,非常的细致,有需要的小伙伴可以参考下
    2017-08-08
  • Python线程池thread pool创建使用及实例代码分享

    Python线程池thread pool创建使用及实例代码分享

    这篇文章主要介绍了Python线程池(thread pool)创建使用及实例代码分享,文章围绕主题展开详细的内容介绍具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Python可视化最频繁使用的10大工具总结

    Python可视化最频繁使用的10大工具总结

    数据可视化是数据科学中不可缺少的一部分,下面这篇文章主要给大家介绍了关于Python可视化最频繁使用的10大工具,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03

最新评论