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: 如果内层函数引 ...
随机推荐
- mysq-5.7忘记密码修改
一,停止mysql /etc/init.d/mysqld stop 二,启动mysql mysqld_safe --skip-grant-tables 安全模式+免验证启动服务 三,登入mysql服务 ...
- python之lambda、filter、map、reduce的用法说明(基于python2)
python中有一些非常有趣的函数,面试的时候可能会遇到.今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,m ...
- laravel学习:主从读写分离配置的实现
本篇文章给大家带来的内容是关于laravel学习:主从读写分离配置的实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在DB的连接工厂中找到以下代码.../vendor/larav ...
- [转帖]从零开始入门 K8s | 手把手带你理解 etcd
从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...
- 第九节:EF Core各种迁移指令(CodeFirst和DBFirst)
一. CodeFirst模式指令 1.前提: 必须的程序集: Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Des ...
- Kubernetes增强型调度器Volcano算法分析【华为云技术分享】
[摘要] Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的.Volcano 方便 AI.大数据.基因.渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异 ...
- thinkphp3.2 无法加载模块
当使用thinkphp3.2时候 出现一个无法加载模块的错误的时候 不要慌张,只需要在根目录下的 index.php 加入一句话就可 define('BIND_MODULE','Home'); // ...
- SQL 自动生成序号
查询出来的数据的编号,不是按照从1开始的有序进行的,界面上显示想显示有序排序 select RANK() OVER(ORDER BY id ) as ID ,* from reconcilet_det ...
- PIE 插件式开发小笔记__PIESDK学习体会
基于PIE.NET-SDK插件式二次开发文档笔记: PIE 插件式开发配置文件: 它里面一行如下: 理解上一行'Item'关系-> library:为插件类名(程序集名称+后缀 ...
- python 动态创建变量 获取变量名
参考链接:https://www.cnblogs.com/technologylife/p/9211324.html 参考链接(未)(使用inspect 获取变量名):https://blog.csd ...