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程序中所有的数据 ...
随机推荐
- intelliJ idea 使用技巧&方法
导入的项目查看svn地址:在项目上右键--subversion--relocate可以看到以前对应的svn地址. 重要的几个快捷键的使用方式: (1) alt+insert 成员变量封装 ...
- ob_flush()和flush()的区别
最近写定时任务,遇到ob_flush()和flush()混淆的问题... ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑- 其实, 他们 ...
- Netscaler立身之本—NAT
Netscaler立身之本—NAT http://blog.51cto.com/caojin/1926579 一.前言 ADC的主要作用是作为服务器的反向代理来进行应用发布的,介于客户端和服务器端之间 ...
- [ZOJ3899]State Reversing
[ZOJ3899]State Reversing 试题描述 Yakumo Yukari is with no doubt one of the most powerful youkai in Gens ...
- 01、BUCK电路的参数计算
案例:设计一个Buck电路,满足如下性能指标要求:一.性能指标要求 1.输入电压 2.输出电压 3.输出电压纹波 4.电流纹波 5.开关频率 二.需要计算的参数 三.BUCK电路拓扑 ...
- [bzoj] 2694 Lcm || 莫比乌斯反演
原题 定义整数a,b,求所有满足条件的lcm(a,b)的和: 1<=a<=A 1<=b<=B ∀n>1,n2†gcd(a,b)(即任意n>1,\(n^2\)不是gc ...
- BZOJ 2226 [Spoj 5971] LCMSum | 数论拆式子
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2226 题解: 题目要求的是Σn*i/gcd(i,n) i∈[1,n] 把n提出来变成Σi/g ...
- [Leetcode] subsets ii 求数组所有的子集
Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...
- 【ZJ选讲·BZOJ 5073】
小A的咒语 给出两个字符串A,B (len<=105) 现在可以把A串拆为任意段,然后取出不超过 x 段,按在A串中的前后顺序拼接起来 问是否可以拼出B串. [题解] ①如果遇 ...
- [学习笔记]LCT进阶操作
LCT总结——应用篇(附题单)(LCT) 一般都是维护链的操作.split即可搞定. 进阶操作的话,处理好辅助树和原树的关系即可搞定. 其实,最大的区别就是,splay随便转,辅助树形态变了,但是原树 ...