@property
考察 Student 类:

class Student(object):def __init__(self, name, score):self.name = nameself.score = score

当我们想要修改一个 Student 的 scroe 属性时,可以这么写:

s = Student('Bob', 59)
s.score = 60

但是也可以这么写:

s.score = 1000

显然,直接给属性赋值无法检查分数的有效性。

如果利用两个方法:

class Student(object):def __init__(self, name, score):self.name = nameself.__score = scoredef get_score(self):return self.__scoredef set_score(self, score):if score < 0 or score > 100:raise ValueError('invalid score')self.__score = score

这样一来,s.set_score(1000) 就会报错。

这种使用 get/set 方法来封装对一个属性的访问在许多面向对象编程的语言中都很常见。

但是写 s.get_score() 和 s.set_score() 没有直接写 s.score 来得直接。

有没有两全其美的方法?----有。

因为Python支持高阶函数,在函数式编程中我们介绍了装饰器函数,可以用装饰器函数把 get/set 方法“装饰”成属性调用:

class Student(object):def __init__(self, name, score):self.name = nameself.__score = score@propertydef score(self):return self.__score@score.setterdef score(self, score):if score < 0 or score > 100:raise ValueError('invalid score')self.__score = score

注意: 第一个score(self)是get方法,用@property装饰,第二个score(self, score)是set方法,用@score.setter装饰,@score.setter是前一个@property装饰后的副产品。

现在,就可以像使用属性一样设置score了:

s = Student('Bob', 59)
s.score = 60
print s.score
s.score = 1000
Traceback (most recent call last):
...
ValueError: invalid score

说明对 score 赋值实际调用的是 set方法。
如果没有定义set方法,就不能对“属性”赋值,这时,就可以创建一个只读“属性”。

python装饰器--@property相关推荐

  1. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用

    python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...

  2. python中self_一个例子带你入门Python装饰器

    ============ 欢迎关注我的公众号:早起python ============ 前言 在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知 ...

  3. python装饰器-Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

  4. python 装饰器 参数-python装饰器的详细解析

    什么是装饰器? python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于 ...

  5. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  6. python装饰器原理-Python装饰器完全解读

    1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨--人生苦短,我用Python. 2 初步理解装 ...

  7. python —— 装饰器

    python -- 装饰器 1.装饰器简介 2.简单装饰器 3.带参数的装饰器 3.类装饰器 4.functools.wraps 5.内置装饰器 5.1 @classmethod 5.2 @stati ...

  8. 【转】python装饰器

    什么是装饰器? python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于 ...

  9. 【python 8】python 装饰器

    文章目录 一.什么是 python 装饰器 二.装饰器的使用 三.装饰器类型 3.1 特性装饰器 @property 3.2 类装饰器 @classmethod 3.3 静态装饰器 @staticme ...

最新文章

  1. C_Imap 邮件的imap
  2. SpringMVC中使用Interceptor拦截器
  3. 论文翻译:ImageNet Classification with Deep Convolutional nerual network
  4. 一个RGB-T工作的小小感悟与总结
  5. oracle 次月,Oracle日期查询:季度、月份、星期等时间信息
  6. mysql dump还原_mysql dump备份和恢复
  7. 《英雄联盟》手游官宣!仍是原来配方和味道 它还能再火十年吗?
  8. 随想录(协议栈的基本技术)
  9. Atitit 完整知识体系表 attilax总结 要读哪些书
  10. 基于EEG的睡眠分期算法记录3-使用决策树多类支持向量机的自动睡眠阶段分类
  11. CPL7用户指南(中文版)_第二章 CPL7 用户指南
  12. Docker 容器内体验 WebSSH
  13. ceph存储 PG的状态机和peering过程
  14. ESP32S 数据手册
  15. als算法参数_矩阵分解之交替最小二乘ALS
  16. 数据处理任务量级巨大?构建预置容器镜像的Amazon EKS解决方案了解一下!
  17. docker — 容器镜像
  18. 《自动化学报》踩坑心得
  19. python之有关关键字参数,默认参数,不定长参数,位置参数的定义,区别,以及使用方法。
  20. 【OpenCV 学习笔记】第二十章: 角点检测之:harris算法以及Shi-Tomasi算法

热门文章

  1. JAVA FEL表达式的使用
  2. redis05_springboot+mybatis整合redis cluster
  3. 以太坊Geth RLP编码源码解析
  4. c++面试题(数据结构篇)
  5. Linux 的md5sum命令
  6. java前置机_银企直联-前置机-企业接入-Java-socket
  7. 大丰画家朱新建_朱新建:画家像是一只鸡
  8. 【UGUI】UGUI 文字背景根据文字大小自适应
  9. 新浪微博加粉丝js实现
  10. 程序员的择业/转业机会来啦,先进计算重点突破领域