Python进阶-III 函数装饰器(Wrapper)
1、引入场景:
检查代码的运行时间
import time def func():
start = time.time()
time.sleep(0.12)
print('看看我运行了多长时间!')
end = time.time()
print('此段代码运行时长为:%s'%(end - start)) func()
如果有大量的函数要检查,这样加入代码太费功夫!考虑提取为一个函数,要检查时直接调用即可
def check_time(f):
start = time.time()
time.sleep(0.12)
f()
end = time.time()
print('此段代码运行时长为:%s' % (end - start)) check_time(func)
还是有问题,有人嫌每次都去调用该函数很麻烦!
能不能,在不修改要测试远行时长的函数的调用方式前提下,还想在原来的函数前后添加测试时长功能?
def timing(f): # 装饰器函数
def inner():
start = time.time()
time.sleep(0.12)
f() # 被装饰函数
end = time.time()
print('此段代码运行时长为:%s' % (end - start)) return inner func = timing(func)
func()
这里就可以定义装饰器函数了,用来装饰其他函数,添加相关功能的函数叫装饰器函数
2、语法糖的使用
@timing # @装饰器函数名 相当于前面函数调用前的赋值:func_to = timing(func_to)
def func_to(): # 被装饰的函数
a = 1000000
b = 1223434
return a * b func_to()
3、装饰器的作用
不想修改函数的调用方式 但是还想在原来的函数前后添加功能
上面的例子中timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
4、装饰带参数的函数
def timing_arg(f):
def inner(a):
start = time.time()
re = f(a)
end = time.time()
print('此段代码运行时长为:%s' % (end - start))
return re return inner @timing_arg
def func_have_arg(a):
result = a * 10000000
return result
5、装饰带可变参数的函数
def wrapper(f): # 装饰器函数,f是被装饰的函数
def inner(*args, **kwargs):
'''在被装饰函数之前要做的事'''
ret = f(*args, **kwargs) # 被装饰的函数
'''在被装饰函数之后要做的事'''
return ret return inner @wrapper # 语法糖 @装饰器函数名
def func_101(a, b): # 被装饰的函数
time.sleep(0.01)
print('老板好同事好大家好', a, b)
return '新年好' print(func_101(100, b=200))
6、编程原则: 开放封闭原则#
开放 : 对扩展是开放的
封闭 : 对修改是封闭的
Python进阶-III 函数装饰器(Wrapper)的更多相关文章
- python 进阶篇 函数装饰器和类装饰器
函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python语法基础-函数-装饰器-长期维护
######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...
- python 修改的函数装饰器
把好的代码记录下来 方便以后学习 修改的函数参数装饰器 from functools import wraps import time import logging def warn(timeout) ...
- python二 总结--函数-- 装饰器
装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码 ...
- Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...
- Python进阶之decorator装饰器
decorator装饰器 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- Python作用域-->闭包函数-->装饰器
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
随机推荐
- App启动时间分析
iOS应用的启动可分为pre-main阶段和main()阶段. 1.pre-main阶段 可以通过配置Scheme,设置DYLD_PRINT_STATISTICS为1,来打印pre-main阶段的时间 ...
- vm ------ 安装
虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件. 虚拟机最 ...
- goang学习笔记---struct
什么是结构体 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似java中的class,是golang面向对象编程的基础类型. 如何定义一个结构体 type ...
- 深入V8引擎-AST(6)
花了5篇才把一个字符串词法给解析完,不知道要多久才能刷完整个流程,GC.复杂数据类型的V8实现那些估计又是几十篇,天呐,真是给自己挖了个大坑. 前面几篇实际上只是执行了scanner.Initiali ...
- Java基础笔记之数据类型
一.数据类型 (一)8种基本数据类型(内置数据类型\C#中为值类型) 字符长度:1byte = 8 bit; 布尔:可认为是 1byte (8 bit);
- Linq分批次,每组1000条
/// <summary> /// 分组插入每次插入1000 /// </summary> /// <param name="data">< ...
- C#中字符串的操作大全
一.C#中字符串的建立过程 例如定义变量 strT="Welcome to "; strT+="www.cuit.edu.cn"; 程序首先创建一个System ...
- SQL 去重 DISTINCT 语法
SQL SELECT DISTINCT语句 在表中可能会包含重复值.这并不成问题, 不过有时你也许希望仅仅列出不同(distinct)的值. 关键词DISTINCT 用于返回唯一不同的值 语法 SEL ...
- 02 .NET CORE 2.2 使用OCELOT -- 路由
继续学习.NET CORE 2.2 使用OCELOT https://www.jianshu.com/p/05ccf87a3091 https://www.jianshu.com/p/585396dc ...
- crawler_app_在Airtest无线模式控制手机
无线模式开启: adb tcpip 48887 参考引用: https://www.cnblogs.com/xieqiankun/p/wireless-mode-of-poco.html