Python 装饰器 property() 函数
描述:property() 函数的作用是在新式类中返回属性值。
@property 装饰器简单理解就是负责把一个方法变成属性调用
下面理解property()方法语法:
class property([fget[, fset[, fdel[, doc]]]])
参数:fget-获取属性值的函数;fset-设置属性值的函数;fdel-删除属性值函数;doc-属性描述信息
实例
class C(object):
def __init__(self):
self._x = None def getx(self):
return self._x def setx(self):
self._x = value def delx(self):
del self._x x = property(getx, setx, delx, "I'm the 'x' property.")
实例化结果:
注:c 是类C的实例化
1、c.x 触发getter;2、c.x = value 触发setter;3、del c.x 触发 deleter
———————————————————— @property ——————————————————————————————
将property 函数用作@property装饰器详解:
getter、setter、deleter方法用作装饰器
class C(object):
def __init__(self):
self._x = None @property
def x(self):
"""I'm the 'x' property."""
return self._x @x.setter
def x(self, value):
self._x = value @x.deleter
def x(self):
del self._x
理解以上,下面来考虑实际场景。
在绑定属性时,如果直接把属性暴露出去,写起来简单,但是没有办法检查参数,导致成绩可以随便改变:
s = Student()
s.score = 9999 #成绩未做校验
为了限制score范围,通过set_score()方法来设置成绩,再通过get_score()获取成绩,在set_score()里面
检查参数:
class Student(object):
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
现在对任意的Student实例进行操作,score就产生了限制:
>>>s = Student() #实例化
>>>s.set_score(60)
>>>s.get_score() #执行get获取成绩
60
>>>s.set_score(9999)#执行set方法校验
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
以上为常规方法实现,下面应用Python内置的@property装饰器负责把一个方法变成属性调用:
class Student(object):
@property
def score(self): #加上@property 把getter方法变成属性
return self._score
@score.setter # 加上@score.setter 把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
可控属性操作:
>>>s =Student()
>>>s.score = 60 #属性赋值操作,实际转化为s.set_score(60)
>>>s.score #获取属性操作,实际转化为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):
@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是只读属性
注:额外函数的名字和property下的一样。
到此,整个property装饰器理解结束,写进博客做记录。
本次资料源自:
廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000
菜鸟教程:
http://www.runoob.com/python/python-func-property.html
Python 装饰器 property() 函数的更多相关文章
- 使用python装饰器计算函数运行时间的实例
使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...
- 关于Python装饰器内层函数为什么要return目标函数的一些个人见解
https://blog.csdn.net/try_test_python/article/details/80802199 前几天在学装饰器的时候,关于装饰器内层函数调用目标函数时是否return目 ...
- python装饰器--@property
@property 考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name sel ...
- Python装饰器(函数)
闭包 1.作用域L_E_G_B(局部.内嵌.全局...): x=10#全局 def f(): a=5 #嵌套作用域 def inner(): count = 7 #局部变量 print a retur ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- Python装饰器、内置函数之金兰契友
装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种.所以也可以理解装饰器是一种特殊的函数.因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展, ...
- Python 带参数的装饰器 [2] 函数参数类型检查
在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
随机推荐
- 如果没有intelliJ 编译器?
刚刚是了一晚上的用记事本来写代码,脱离编译器,发现自己完全废了. 写了好多个类,在命令行编译失败,上网查错误,说编码问题, 编码问题解决后,命令行还是编译失败,粘贴到编译器 发现完全是自己代码能力太弱 ...
- (六)SpringBoot整合Swagger2框架
一:什么是Swagger Swagger是一款通过我们添加的注解来对方法进行说明,来自动生成项目的在线api接口文档的web服务. 二:添加Swagger2依赖 <dependency> ...
- TensorFlow图像处理函数
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 图像编码处理+图像大小调整+图像翻转+图像色彩调整+处理标注框 #!/usr/bin/env python # - ...
- python之unittest
unittest是单元测试的一个框架 在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoade ...
- AtCoder Grand Contest 016 E - Poor Turkeys
题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_e 题目大意: 有\(N\)只火鸡,现有\(M\)个人,每个人指定了两只火鸡\(x,y\),每 ...
- RHEL6.5、RHEL7.2忘记ROOT密码恢复小结
RHEL6.5忘记root密码恢复步骤 RHEL7.2恢复密码步骤 5.耐心等待重启完成即可实现重置root密码 也可以按如下做法 依次执行chroot /sysroot/,passwd===> ...
- ios学习笔记 UITableView(纯代码) (一)
参考 “https://www.cnblogs.com/ai-developers/p/4557487.html” UITableViewCell 有一个代码重用 减少资源的浪费 参考 https: ...
- 作用域链、this细说
一.作用域链 作用域:浏览器给js的一个生存环境(栈内存) 作用域链:js中的关键字var和function 都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行 ...
- 【学习笔记】深入理解js原型和闭包(1)—— 一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的运算符——typeof.typeof ...
- STM32 modbus CRC16校验
typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef int int32_t; const uint16_t ...