描述: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() 函数的更多相关文章

  1. 使用python装饰器计算函数运行时间的实例

    使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...

  2. 关于Python装饰器内层函数为什么要return目标函数的一些个人见解

    https://blog.csdn.net/try_test_python/article/details/80802199 前几天在学装饰器的时候,关于装饰器内层函数调用目标函数时是否return目 ...

  3. python装饰器--@property

    @property 考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name sel ...

  4. Python装饰器(函数)

    闭包 1.作用域L_E_G_B(局部.内嵌.全局...): x=10#全局 def f(): a=5 #嵌套作用域 def inner(): count = 7 #局部变量 print a retur ...

  5. python装饰器1:函数装饰器详解

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...

  6. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  7. Python装饰器、内置函数之金兰契友

    装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种.所以也可以理解装饰器是一种特殊的函数.因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展, ...

  8. Python 带参数的装饰器 [2] 函数参数类型检查

    在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...

  9. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

随机推荐

  1. Two Flowers CodeChef - TWOFL

    https://vjudge.net/problem/CodeChef-TWOFL 先把颜色相同的合并成一个点,建好图,枚举要取的两种颜色(根据图中所有边决定哪些组合要枚举)即可 错误记录: 1.写了 ...

  2. 18.3.2从Class上获取信息(注解)

    package d18_3_1; /** * Class类上所包含的注解 * * getAnnotation(Class annotationClass) 获取该元素上指定的类型的注解 * getAn ...

  3. 根据 目录号 案卷号 用户名 查询 page 中 的条数

    select count(*) from am_b_page a join am_b_entry b on a.entry_id=b.entry_id where b.catalogue_code=' ...

  4. 用户控件引用Entity Framework

    背景: 今天在做软件的时候,出现了问题,我在项目里面添加了Entity Framework,在form的代码里引用没有问题,在userControl里引用就出了问题. 我检查app.config文件 ...

  5. mysql多表查询20题

    +-------------------+| Tables_in_dapeng3 |+-------------------+| class || course || s1 || score || s ...

  6. 如何正确理解和使用 Activity的4种启动模式

    关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法,便于读者正确应用. Activity的启动模式有4 ...

  7. 毕业设计:HomeFragment(一)

    一.主要思路 主要是通过ListView实现. 考虑到以后会添加长按修改功能,所以好几个地方都是用的FramLayout,而且CheckBox初始状态是被隐藏的.给ListView添加OnItemCl ...

  8. IP地址 子网掩码 默认网关和DNS服务器的关系

    在过去,男人是需要能够上房揭瓦的,是要能够修水管的.现在的男人是需要会装系统的,会设置路由器的.世界变化太快! 废话不多说,本文来讨论一下电脑上最为常见的几个网络参数:IP地址.子网掩码.默认网关和D ...

  9. 设置QtreeWidget水平滚动条

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7552603.html //设置treewidget水平滚动条 ui.treeWidget->header ...

  10. rmdir

    rmdir——删除空目录 remove empty directories 命令所在路径:bin/rmdir 示例: # rmdir /tmp/japan/longze 删除/tmp/japan/目录 ...