Python之旅:装饰器
装饰器就是闭包函数的一种应用场景
一、为何要用装饰器
开放封闭原则:软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
也就是说我们必须找到一种解决方案:能够在不修该一个功能源代码以及调用方式的前提下,为其加上新功能
上述总结,原则如下:
1、不修改源代码
2、不修改调用方式
目的:
在遵循1和2原则的基础上扩展新功能
二、什么是装饰器
器指的工具,装饰指的是为被装饰对象添加新功能
完整含义:
装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能装饰器与被装饰的对象均可以是任意可调用的对象
装饰器=》函数
被装饰的对象=》函数
三、无参装饰器
#无参装饰器模板
def outer(func):
def inner(*args,**kwargs):
res=func(*args,**kwargs)
return res
return inner
###现在我们要查看指令执行的时间
#以前实现的方式
#违反了装饰器的原则---》不修改源代码
import time #导入时间模块 def index():
start_time=time.time() #现在时间
time.sleep(3) #暂停3s
print('welcome to index page')
stop_time=time.time() #现在的时间(time.sleep与print执行完后的时间)
print('run time is %s' %(stop_time-start_time)) index() #调用函数 #修订1
#没有违背原则,但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复
import time def index():
time.sleep(3)
print('welcome to index page') start_time=time.time()
index()
stop_time = time.time()
print('run time is %s' % (stop_time - start_time)) #但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复 import time def index():
time.sleep(3)
print('welcome to index page') def home(name):
time.sleep(5)
print('welcome %s to home page' %name) start_time=time.time() #代码重复
index()
stop_time = time.time() #代码重复
print('run time is %s' % (stop_time - start_time)) #代码重复 start_time=time.time()
home('egon')
stop_time = time.time()
print('run time is %s' % (stop_time - start_time)) #修订2 # 修改了原函数的调用方式 import time def index():
time.sleep(3)
print('welcome to index page') def home(name):
time.sleep(5)
print('welcome %s to home page' %name) def wrapper(func): #func=index
start_time=time.time()
func() #index()
stop_time = time.time()
print('run time is %s' % (stop_time - start_time)) wrapper(index) # 修改了原函数的调用方式 #修订3 import time def index():
time.sleep(3)
print('welcome to index page') def outter(func): #func=最原始的index
# func=最原始的index
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print(stop_time-start_time)
return wrapper index=outter(index) # 新的index=wrapper index() #wrapper()
无参装饰器
四、无参装饰器升级版
import time def index():
time.sleep(1)
print('welcome to index page')
return 122 def home(name):
time.sleep(2)
print('welcome %s to home page' %name) #==============装饰器
def timmer(func):
#func=最原始的home
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #调用最原始的home
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ========================================== # res=index() #res=wrapper()
# print(res) home(name='egon') #wrapper('egon')
index() #wrapper()
五、装饰器语法
#就是一个@调用某个装饰器 import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper @timmer #index=timmer(index) #语法调用方式
def index():
time.sleep(1)
print('welcome to index page')
return 122 @timmer # home=timmer(home) #语法调用方式
def home(name):
time.sleep(2)
print('welcome %s to home page' %name) # index()
home('egon')
六、认证装饰器实现
七、叠加多个装饰器
八、有参数装饰器
Python之旅:装饰器的更多相关文章
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- python笔记 - day4-之装饰器
python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- 第二篇:python高级之装饰器
python高级之装饰器 python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- Python进阶之装饰器
函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...
- Python的property装饰器的基本用法
Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...
随机推荐
- sqlserver(2012)清理tempdb
当数据库运行时间长了之后,tempdb变得特别大,几十G,受不了啊:当然我们知道重启 SQL Server服务的话,tempdb数据库会自动重新创建的,从而使 tempdb 回归到初始大小.但是这是生 ...
- mybatis按datetime条件查询,参数为时间戳时
mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...
- 使用 Mesos 管理虚拟机
摘要 为了满足渲染.基因测序等计算密集型服务的需求,UCloud 推出了“计算工厂”产品,让用户可以快速创建大量的计算资源(虚拟机).该产品的背后,是一套基于 Mesos 的计算资源管理系统.本文简要 ...
- How to pass an Amazon account review
Have you ever sold products on Amazon? How about sold so much within the first week that amazon deci ...
- DoItYourself!
在杨老师的勉励下,我准备开始“自己”写程序.速度很慢,不过在写的过程中对于用到的几个函数更加熟悉.也尝试多学一点,学透一点.遇到不会的函数,语法不清楚的,还是会百度,不过会自己再敲一遍.重复下去. 下 ...
- “Hello World!“”团队第五周召开的第二次会议
今天是我们团队“Hello World!”团队第五周召开的第二次会议.也祝大家双十一快乐~~博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七 ...
- mininet实验 可视化界面形成拓扑
参考博客一 参考博客二 实验目的 mininet中内置了一个mininet可视化工具:miniedit.miniedit在mininet/mininet/examples目录下提供miniedit.p ...
- Codeforces Beta Round #8 C. Looking for Order 状压dp
题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...
- WCF RestFull提交数据超出限额解决方法
最近在使用wcf restfull时出现了超大数据提交出错的问题. 服务端会返回错误:服务器处理请求时遇到错误.有关构造有效服务请求的内容,请参阅服务帮助页.异常消息为“反序列化对象 属于类型 Yes ...
- 多tab点击切换
现在来一个小练习,就是用js实现多tab之间的切换: <body> <ul id="tab"> <li id="tab1"> ...