当前位置: 首页 > news >正文

Python之装饰器

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的作用:在不改变原函数及原函数的执行的情况下,为原函数增加一些额外的功能,比如打印日志、执行时间,登录认证等等。

测试函数的执行时间:

一个简单的装饰器:

import time

def func1():
print('晚上回家吃饭!')
time.sleep(1)
def func2():
print("晚上不回家吃饭!")
time.sleep(1)
def timer(f1):
star_time = time.time()
f1()
end_time = time.time()
print('耗时:%s'%(end_time-star_time))

f = func1
func1 = timer
func1(f)

import time

def func1():
print('晚上回家吃饭!')
time.sleep(1)
def func2():
print("晚上不回家吃饭!")
time.sleep(1)
def timer(f1): # f1 = func1
  def inner():
    star_time = time.time()
    f1()
  end_time = time.time()
    print('耗时:%s'%(end_time-star_time))
  return inner
func1 = timer(func1) #实际返回inner
func1() #相当于执行inner()

但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样还是有点麻烦,
因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方法,python给你提供了,那就是语法糖。
import time

def timer(f1): 
  def inner():
    star_time = time.time()
    f1()
  end_time = time.time()
    print('耗时:%s'%(end_time-star_time))
  return inner
@timer #相当于 func1 = timer(func1) 返回inner
def func1():
print('晚上回家吃饭!')
time.sleep(1)
func1()


带参数的装饰器:
import time

def timer(f1): #f1 = func1
def inner(*args,**kwargs):
star_time = time.time()
f1(*args,**kwargs)
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
return inner
@timer #相当于 func1 = timer(func1) 返回inner
def func1(a,b):
print(a,b)
print('晚上回家吃das 饭!')
time.sleep(1)
func1(11,22) #相当于执行inner(11,22)
带返回值的装饰器
import time

def timer(f1):
def inner(*args,**kwargs):
star_time = time.time()
'''上面的代码是执行函数之前的操作'''
ret = f1(*args,**kwargs)
'''下面的部分是执行函数之后的操作'''
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
return ret
return inner
@timer #相当于 func1 = timer(func1) 返回inner
def func1(a,b):
print(a,b)
print('晚上回家吃das 饭!')
time.sleep(1)
return 666
print(func1(11,22)) #相当于执行inner(11,22)
执行结果

  11 22
  晚上回家吃das 饭!
  耗时:1.0000572204589844
  666






















转载于:https://www.cnblogs.com/xiaoAzaina/p/8877433.html

相关文章:

  • t420i升级固态硬盘提升_老主机升级东芝RC500 NVMe固态硬盘,性能提升有多少?
  • 使用决策树预测隐形眼镜类型
  • 致远a8-v5-6.0协同管理软件_易达酒吧管理软件下载-易达酒吧管理软件v10.0免费版...
  • 如何让你产品的用户拥有一流的上传体验
  • fedora如何隐藏顶部状态栏_装修冷知识 厨房管道怎么隐藏?
  • 感悟
  • 2020cf自动准备怎么用_天天都在用的转向灯是怎么自动回位的?
  • 第一学期《计算机网络》作业一_【实用】新学期学习计划范文九篇
  • linux下创建普通用户并赋予某个目录的读写权限
  • 第六周小组作业:软件测试和评估
  • 在matlab上利用fft进行信号频谱分析_MATLAB下使用fft进行频域分析
  • 如何确定电脑主板坏了_维修变频器的前景如何?
  • HashMap的实现原理
  • 小米id锁状态查询_揭秘:苹果隐藏ID到底是什么?你可能就被坑了!
  • 典型系统~广告系统和记数系统(转)
  • 2017前端实习生面试总结
  • ESLint简单操作
  • Java到底能干嘛?
  • java中的hashCode
  • MD5加密原理解析及OC版原理实现
  • MobX
  • npx命令介绍
  • python大佬养成计划----difflib模块
  • React的组件模式
  • SAP云平台里Global Account和Sub Account的关系
  • spring security oauth2 password授权模式
  • vue 配置sass、scss全局变量
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • windows下如何用phpstorm同步测试服务器
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 设计模式走一遍---观察者模式
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 智能网联汽车信息安全
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define 用法
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $L^p$ 调和函数恒为零
  • (9)STL算法之逆转旋转
  • (Java)【深基9.例1】选举学生会
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (接口自动化)Python3操作MySQL数据库
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (算法)N皇后问题
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • *Django中的Ajax 纯js的书写样式1
  • .naturalWidth 和naturalHeight属性,
  • .NET和.COM和.CN域名区别