python装饰器 property_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装饰器计算函数运行时间的实例

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

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

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

python装饰器--&commat;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 带参数的装饰器 &lbrack;2&rsqb; 函数参数类型检查

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

Day11 Python基础之装饰器&lpar;高级函数&rpar;(九)

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

随机推荐

Comet技术

1.Comet是什么? 维基百科: Comet是一种用于web的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 说白了就是web ...

&lbrack;Angularjs&rsqb;国际化

写在前面 在项目中,有用到国际化,跟着就了解了下使用angularjs实现的国际化,这里做一下记录. 系列文章 [Angularjs]ng-select和ng-options [Angularjs]n ...

C&num;数据类型转换的几种形式

1.隐式转换:一般是低类型向高类型转化,能够保证值不发生变化. 隐式数值C#数据类型转换: 从 sbyte 到 short.int.long.float.double 或 decimal. 从 byt ...

NOI2003 文本编辑器

练手QAQ #include #include #include #include

Linux页快速缓存与回写机制分析

參考 ******************************************* 页快速缓存是linux内核实现的一种主要磁盘缓存,它主要用来降低 ...

设计模式---订阅发布模式&lpar;Subscribe&sol;Publish&rpar;

设计模式---订阅发布模式(Subscribe/Publish) 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有订阅者对象,使 ...

分享基于&period;NET MVC&plus;EF CodeFirst&plus;IOC&plus;EasyUI的框架设计

**注:要做工,没什么时间,等有空时会上传到GIT,项目结构如上,简单的说一下: **支持IOC及多数据库等,各项目由MVC区域隔离: 主要使用基于接口与抽象类进行高度的抽象与接口隔离,与其它框架比较 ...

cookie中存中文

cookie中存中文 1:想要在cookie中存中文:需要用到URLEncoder(在jdkAPI中有介绍) Cookie cookie = new Cookie("User",U ...

python 包 笔记

绝对导入和相对导入 我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式: 绝对导入:以glance作为起始 相对导入: ...

CentOS7 查看显卡信息

A卡: [root@t1 ~]# lspci | grep -i vga 00:02.0 VGA compatible controller: Cirrus Logic GD 5446 N卡: [ro ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值