day14 装饰器
装饰器 本质上就是函数,功能是为其他函数添加附加功能
原则:不修改被修饰函数的源代码,以及调用方式,即完全不能有任何改变
装饰器 = 高阶函数+ 函数嵌套+ 闭包
高阶函数:函数作为参数或者返回一个函数
闭包:必须要有函数嵌套,内部函数调用外部函数的变量
利用现有的姿势用高阶函数来实现装饰器的效果
并没有更改foo函数的源代码,也实现了foo函数计算运算时间的附加功能
但是却改变了foo函数的调用方式,以后都要用test(foo)才能调用
import time
def foo():
time.sleep(3)
print('你好啊林师傅') def test(func):
# print(func)
start_time=time.time()
func()
stop_time = time.time()
print('函数运行时间是 %s' % (stop_time-start_time))
# foo()
test(foo) # 改变了调用方式了
高阶函数的特性可以返回函数,可以实现不更改调用方式的问题
def foo():
print('from the foo')
def test(func):
return func res=test(foo)
print(res)
res() foo=test(foo)
print(res)
foo()
不修改foo源代码,不修改foo调用方式,但是函数多运行了一次,废物
import time
def foo():
time.sleep(3)
print('来自foo') def timer(func):
start_time=time.time()
func()
stop_time = time.time()
print('函数运行时间是 %s' % (stop_time-start_time))
return func
foo=timer(foo) #timer()运行了一次得出结果又赋值给foo
foo() # foo()又重新运行一遍,,,,
没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能
def timer(func):
start_time=time.time()
return func
stop_time = time.time()
print('函数运行时间是 %s' % (stop_time-start_time)) foo=timer(foo)
foo()
由此可见,高端函数仁义尽致依然做不到我们想要的那种透明而又不加大负担的效果因此需要装饰器
装饰器的框架
def nnn(func):
def inner(*args,**kwargs):
"""在这里我做了一些什么操作"""
ret = func(*args,**kwargs)
"""在这里我又做了一些什么操作"""
return ret # 被装饰的函数的返回值
return inner
@nnn
def big():
print("这是一个超级大源码")
big() # 本质上big() == nnn(big),但是装饰器不改变函数的调用方式,简化为big()
一个基本的计算运行时间的装饰器的例子
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
stop_time = time.time()
print("函数的运行时间是%s" %(stop_time - start_time))
return res
return wrapper @timmer
def cal(l):
res = 0
for i in l:
time.sleep(0.1)
res += i
return res print(cal(range(20)))
带参数,返回值的装饰器使用
import time
def timmer(func):
def wrapper(*args,**kwargs): # *args,**kwargs 模拟一切参数
start_time = time.time()
res = func(*args,**kwargs) # 实际上就是运行test() ,将test() 的结果拿出来赋值
# 和上面的wrapper的参数进行一一对应的解压
stop_time = time.time()
print("运行时间: %s " %(stop_time - start_time))
return res # 将赋值后的变返回值在通过wrapper再返回
return wrapper @timmer # test = timmer(test)
def test(name,age):
time.sleep(1)
print("我是天才,名字是%s ,年领是 %s" %(name,age))
return "我是天才返回值" # res = test("yangtuo",18) # 就是在运行wrapper
# print(res)
test("yangtuo",18) @timmer # test1 = timmer(test1)
def test1(name,age,gender):
time.sleep(1)
print("我是天才一号,名字是%s ,年领是 %s,性别是 %s" %(name,age,gender))
return "我是天才一号返回值" test1("shijieli",19,"man")
day14 装饰器的更多相关文章
- day14——装饰器
day14 装饰器 装饰器本质就是闭包 开放封闭原则: 扩展是开放的(增加新功能),对源码是封闭的(修改已经实现的功能) 装饰器:用来装饰的工具 作用:在不改变源代码及调用方式的基础下额外增加新的功能 ...
- python学习day14 装饰器(二)&模块
装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...
- day14 装饰器模拟验证附加功能
user_list=[ {'}, {'}, {'}, {'}, ] current_dic={'username':None,'login':False} def auth_func(func): d ...
- day14 带参装饰器、迭代器、生成器
""" 今日内容: 1.带参装饰器及warps 2.迭代器 3.生成器 """ """ # 一.带参装饰器及w ...
- day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象
复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...
- day-14带参装饰器、迭代器
带参装饰器 通常,装饰器为被装饰的函数添加新功能,需要外界的参数 -- outer参数固定一个,就是func -- inner参数固定同被装饰的函数,也不能添加新参数 -- 可以借助函数的嵌套定义, ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- day14(带参装饰器,迭代器,生成器,枚举对象)
一,复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...
- python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题
1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名( ...
随机推荐
- 分析网络流量Capsa笔记
Capsa是一款网络分析仪,允许您监控网络流量,解决网络问题并分析数据包.通过提供生动的图表,通过设计良好的GUI提供丰富的统计信息和实时警报,Capsa可让IT管理员实时识别,诊断和解决有线和无线网 ...
- 使用自定义端口连接SQL Server的方法(转载)
使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题.如何在Mi ...
- Luogu P2421 [NOI2002]荒岛野人
最近上课时提到的一道扩欧水题.还是很可做的. 我们首先注意到,如果一个数\(s\)是符合要求的,那么那些比它大(or 小)的数不一定符合要求. 因此说,答案没有单调性,因此不能二分. 然后题目中也提到 ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- 大话重构连载15:采用Mock技术完成测试
第五次重构我们引入了数据库的设计,用户信息要从数据库中读取,问候语库存储在数据库中,并支持添加与更新.数据库的引入使自动化测试变得困难了,因为数据状态总是变化着的,而这种变化使得测试过程不能复现,这是 ...
- Bash 笔记
获取当前工作目录 basepath=$(cd `dirname $0`; pwd) 源文 : https://sexywp.com/bash-how-to-get-the-basepath-of-cu ...
- 《蹭课神器》Beta版使用说明
相比 Alpha 版,我对主界面进行了优化,使主界面更加简洁 同时数据库增加了一个表,里面存放的是课程的详细信息
- Laravel 5.5 文档 ] 快速入门 —— 安装配置篇
服务器要求 Laravel 框架对PHP版本和扩展有一定要求,不过这些要求 Laravel Homestead 都已经满足了,不过如果你没有使用 Homestead 的话(那真是一件很遗憾的事情),有 ...
- Win2016以及win10 IIS10 下安装IEwebcontrol的方法
1. 公司产品需要安装IE webcontrol控件 但是在win2016以及win10 上面安装时 因为IIS 已经升级到了IIS10 安装时会提示: 兼容解决的方法比较简单,修改注册表即可 HKE ...
- 判断Excel版本信息
可以通过获取application对应的Version属性获取当前打开的Excel的版本信息(Application.Version).