Python 进阶 之 @property
@property是一个装饰器,由Python原生库所支持,无需import
@property 的作用是将函数变成属性,一般作用于类内的成员函数。
先贴个代码来描述一下@poperty存在的意义:
>>> class Money(object):
... def money(self):
... return self.private_money
...
>>> a = Money()
>>> a.money()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in money
AttributeError: 'Money' object has no attribute 'private_money'
>>> a.private_money = 1000
>>> a.money()
1000
>>> a.private_money = 10000
>>> a.money()
10000
我们声明了一个类Money,该类有个money函数用来返回类实例的私有money。
这个类正常使用没有什么问题,但有个隐患就是在调用money函数前是不知道类实例的当前私有money的值的,因为money的值实在太容易发生变化了,没有任何限制。做个惶恐的假设,这个money如果指的是老板发给员工的工资,老板岂不是要亏死了。。
我们对该类做个改进,限制一下money的值
>>> class Money(object):
... def money(self):
... if self.test_money > 2000 or self.test_money < 1000:
... raise ValueError
... else:
... return self.test_money
...
>>> a = Money()
>>> a.test_money = 1000
>>> a.money()
1000
>>> a.test_money = 10000
>>> a.money()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in money
ValueError
现在能够限制Money的自由变化了,但是对于money的赋值和取值似乎有点麻烦了(赋值:a.test_money = 1000, 取值a.money),有没有一种方法既能实现变量值的限制,又能简化值的调用呢, 请看代码:
>>> class Money(object):
... @property
... def money(self):
... if self.test_money > 2000 or self.test_money < 1000:
... raise ValueError
... else:
... return self.test_money
...
>>> a = Money()
>>> a.test_money = 1000
>>> a.money()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> a.money
1000
可以看到,@property已经将money函数变成了一个属性,在调用a.money()时会发生error,调用a.money时即可正常。似乎还是有点麻烦,私有money的赋值还是有点麻烦,根据鸭子定则,如何能把money函数真正变成一个“属性呢”,看下述代码:
>>> a.money
1000
>>> class Money(object):
... @property
... def money(self):
... if self.test_money > 2000 or self.test_money < 1000:
... raise ValueError
... else:
... return self.test_money
... @money.setter
... def money(self, value):
... self.test_money = value
...
>>> a = Money()
>>> a.money = 1000
>>> a.money
1000
money.setter重写了money属性的写权限,money.getter 可重写money属性的读权限,在此不再赘述
Python 进阶 之 @property的更多相关文章
- Python进阶:@property 动态属性
Python进阶:@property 动态属性 Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下. 先看一个简单的例子.创建一个 Stu ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python进阶篇
python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. import sys ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- python进阶强化学习
最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...
- python基础——使用@property
python基础——使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9 ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- Python进阶 - 对象,名字以及绑定
Python进阶 - 对象,名字以及绑定 1.一切皆对象 Python哲学: Python中一切皆对象 1.1 数据模型-对象,值以及类型 对象是Python对数据的抽象.Python程序中所有的数据 ...
随机推荐
- Packet filtering with Linux & NAT
http://www.linuxfocus.org/ChineseGB/May2003/article289.shtml Gateway, Proxy-Arp 和 Ethernet Bridge ? ...
- Centos7安装GUI桌面
2018-03-02 21:37:48 Centos7-1708成功 yum -y groupinstall "GNOME Desktop"
- EXEL文件转成简书MD表格
EXEL文件转成简书MD表格 0.1.3 mac: https://github.com/fanfeilong/exceltk/blob/master/pub/exceltk.0.1.3.pkg wi ...
- 【bzoj2326】[HNOI2011]数学作业 矩阵乘法
题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...
- 【bzoj2330】[SCOI2011]糖果 差分约束系统
题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...
- 对C++ templates类模板的几点补充(Traits类模板特化)
前一篇文章<浅谈C++ templates 函数模板.类模板以及非类型模板参数>简单的介绍了什么是函数模板(这个最简单),类模板以及非类型模板参数.本文对类模板再做几点补充. 文章目录1. ...
- 第五届华中区程序设计邀请赛暨武汉大学第十四届校赛 网络预选赛 A
Problem 1603 - Minimum Sum Time Limit: 2000MS Memory Limit: 65536KB Total Submit: 564 Accepted: ...
- [bzoj 3224]手写treap
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3224 bzoj不能用time(0),看到这个博客才知道,我也RE了好几发…… #inclu ...
- bzoj 1110 [POI2007]砝码Odw 贪心+进制转化
[POI2007]砝码Odw Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 661 Solved: 366[Submit][Status][Disc ...
- 数据仓库3级范式(3NF)基础
一.引言 最近在整理理大数据模式下的数据仓库数据模型,资料来自互联网和读过的数据仓库理论和实践相关. 二.3NF (1)1NF-无重复的列 数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个 ...