介绍Python的@property装饰器的用法_python_脚本之家

在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

s = Student()
s.score = 9999

这显然不合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:

class Student(object):def get_score(self):return self._scoredef 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

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:

>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):...
ValueError: score must between 0 ~ 100!

但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!

还记得装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的:

class Student(object):@propertydef score(self):return self._score@score.setterdef 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

@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):...
ValueError: score must between 0 ~ 100!

注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student(object):@propertydef birth(self):return self._birth@birth.setterdef birth(self, value):self._birth = value@propertydef age(self):return 2014 - self._birth

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。
小结

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

介绍Python的@property装饰器的用法_python_脚本之家相关推荐

  1. python装饰器 property_介绍Python的@property装饰器的用法

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  2. pythonproperty装饰器_实例讲解Python编程中@property装饰器的用法

    取值和赋值 class Actress(): def __init__(self): self.name = 'TianXin' self.age = 5 类Actress中有两个成员变量name和a ...

  3. [转载] python中@property装饰器

    参考链接: Python @property装饰器 Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只 ...

  4. Python @property装饰器的用法,判断函数参数整形、字符串、取值范围

    如果我们对所赋的值有一定的限制,比如要求名字必须是字符串,年龄必须是数字,否则会对方法的调用造成影响,这个时候单纯的赋值就不能满足这样的过滤效果了.既然是条件过滤,那么这几条代码就需要放在方法里,所以 ...

  5. python中的@property装饰器

    引言 本文将要介绍Python中@property装饰器,这是一种python风格的getters和setters方法.Python编程为我们提供了一个内置的@property装饰器,它使面向对象编程 ...

  6. python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)

    Python中@property装饰器的技巧性用法(代码示例) 本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下 ...

  7. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  8. python内置装饰器property_Python中的内置装饰器之property

    装饰器是Python中很重要的一个概念,但是这篇文档不介绍装饰器的实现,我们只需要知道装饰器可以实现一些功能: Python中也包含一些自带的装饰器,这次就说一下属性装饰器property 相关知识点 ...

  9. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

最新文章

  1. OpenAI发布最新「模拟机器人环境」,用「真实机器人」模型进行训练
  2. 上帝视角任意切换:三维重建和图像渲染是怎么结合的?
  3. vscode 调试html页面,基于VSCode调试网页JavaScript代码过程详解
  4. mysql mysqldump只导出表结构或只导出数据的实现方法
  5. GridView中如何实现checkbox 默认选中
  6. java设计模式---享元模式
  7. MapReduce 应用:TF-IDF 分布式实现
  8. 运筹学广泛的使用计算机,运筹学笔记
  9. 聊聊如何设计千万级吞吐量的.Net Core网络通信!
  10. c# -- 二维码生成
  11. NHibernate ModelBinder for mvc3
  12. NYOJ759 你知道这个规律吗
  13. 单片机c语言全解 pdf,单片机c语言程序.pdf
  14. 电脑故障维修判断指导大全
  15. SpringBoot整合editormd富文本编辑器
  16. 【printf】打印数值、打印二进制、打印十六进制、sprintf
  17. java tt自行车_骑行圈的知识科普:“大组车”和“TT”车的区别
  18. 星空云协同开发入门(一)
  19. CentOS6.5下搭建LAMP+FreeRadius+Daloradius Web管理和TP-LINK路由器、H3C交换机连接,实现,上网认证和记账功能
  20. gitlab+Jenkins自动化搭建部署

热门文章

  1. 智能镜——4.产品创建及开发环境搭建篇
  2. Qt COM组件导出源文件
  3. h5点击图片自动放大_关于微信上网页图片点击全屏放大效果
  4. 中国血液透析产业现状与投资战略研究报告(2021版)
  5. gslx680触摸屏驱动源码码分析(gslX680.c)
  6. AD15元器件向导封装
  7. 打开任务管理器,不小心关闭了windows资源管理器,桌面不见了
  8. IDEA jsp 无法自动提示代码
  9. java SWT:最有效的layout方法Control.requestLayout()
  10. 【AutoSAR】【BootLoader】自我刷新