初识Python装饰器
python中,一切皆对象。做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用。
函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的返回值被引用。
在现代软件开发之中,有一个非常重要的原则,那就是开放封闭原则。
所谓开放封闭原则就是软件实体应该对扩展开放,而对修改封闭。
开放封闭原则是所有面向对象原则的核心。
软件设计本身所追求的目标就是封装变化,降低耦合,而开放封闭原则正是对这一目标的最直接体现。
开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。
为什么要用到开放封闭原则呢?
软件需求总是变化的,世界上没有一个软件的是不变的,因此对软件设计人员来说,必须在不需要对原有软件代码进行修改的情况下,实现灵活的系统扩展。
如何做到对扩展开放,对修改封闭呢?
在python中,有一个很好的设计,那就是装饰器。装饰器的作用就是为已经存在的函数对象添加额外的功能
装饰器本质上是一个Python函数,可以是任意可调用对象,被装饰对象也可以是任意可调用对象。
装饰器的功能是:
在不修改被装饰器对象源代码以及被装饰对象的调用方式的前提下,为被装饰对象添加新功能
例如:
import time
def index():
time.sleep(3)
print("Welcome to index page")
index()
结果会打印"Welcome to index page"这句话。那么,假如现在我想为这个函数添加一个统计这段程序运行时间的功能,在符合开放封闭的前提下怎么实现呢?
用装饰器就可以实现了。
import time
def timmer(func):
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print("The page run time is %s"%(stop_time-start_time))
return wrapper
@timmer
def index():
time.sleep(3)
print("Welcome to index page")
index()
运行结果如下:
Welcome to index page
The page run time is 3.000171422958374
在这段代码里,在index函数的上面一行的那个@timmer就是装饰器的专有语法,其调用方式等同于:index=timmer(index)。
程序运行步骤:
1.程序执行index函数,此时相当于执行index=timmer(index),把index函数作为一个参数传递给timmer这个函数。
2.调用timmer函数时,就相当于是在调用timmer函数的内部函数wrapper。
3.index作为timmer外层函数的参数,在wrapper这个内部函数的里面也在调用。
4.在wrapper函数调用完成后,执行的结果又返回给wrapper函数,此时相当于把index函数,以及打印程序运行时间的功能执行的结果返回给timmer这个函数。
5.如前所述,timmer函数的执行结果也就等同于返回给index函数,这样就完成了装饰器的调用过程。
在这段代码里,原有的程序就是index函数部分代码未做任何修改,index函数的调用方式也未做任何改变,统计程序的运行时间的功能也已经添加完成,这里就使用了装饰器的功能。
初识Python装饰器的更多相关文章
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- Codeforces 842A Kirill And The Game【暴力,水】
A. Kirill And The Game time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...
- UVA 11292 Dragon of Loowater(简单贪心)
Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...
- PE 001~010
题意: 001(Multiples of 3 and 5):对小于1000的被3或5整除的数字求和. 002(Even Fibonacci numbers):斐波那契数列中小于等于4 000 000的 ...
- Open-air shopping malls(二分半径,两元交面积)
http://acm.hdu.edu.cn/showproblem.php?pid=3264 Open-air shopping malls Time Limit: 2000/1000 MS (Jav ...
- flume1.8 开发指南学习感悟
概述: Apache Flume是一个分布式.可用的系统,用于从许多不同的sources有效的收集并移动大量日志数据用于集中存储数据. 架构及数据流动模型: flume实际上就是一个Agent.Age ...
- jquery dataTimePicker日历插件(精确到小时)
效果图: 下载地址:https://github.com/WangChangyao/jquery-dataTimePicker.git <!DOCTYPE html> <h ...
- 阻止浏览器冒泡事件,兼容firefox和ie
//得到事件 function getEvent(){ if(window.event) {return window.event;} func=getEvent.caller; while(func ...
- [学习OpenCV攻略][010][写入AVI文件]
cvSize(文件宽度,文件高度) 通过图片或视频文件的宽高得到尺寸信息,返回值是CvSize cvCreateVideoWriter(输出文件名,编码格式,帧率,图像大小) 通过设置输出视频的格式信 ...
- respondsToSelector
SEL sel = @selector (start:) ; // 指定action if ([obj respondsToSelector:sel]) { //判断该对象是否有相应的方法 [obj ...
- mysql 安装以及配置
MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有setup.exe,面对一堆文件一头雾 ...