python语言中的函数装饰器
装饰器
什么是装饰器?
装饰:给已有的对象(函数)添加新的功能
器:工具 在python中指具备某些功能的函数
装饰器:装饰器就是一个给其他函数增加功能的函数
一种设计原则:
开闭原则:对扩展开放
对修改封闭
装饰器怎么用
我们用一个例子说明装饰器的作用及用法
例子: 现需要统计一段程序运行的时间
#统计程序运行时间,首先我们写一个程序
import time
def index():
time.sleep(1)
print('login')
#以上就是一个打印login的程序,该程序休眠时间为1S
#如果我们要增加一个计时功能,该怎么实现呢?首先我们可以尝试从我们的设计原则入手
#如果我们按照增加代码的形式可以看下:
import time
def index():
time.sleep(1)
print('login')
start=time.time()
index()
end = time.time()
print('程序运行的时间',end-start)
#或者
import time
def index():
time.sleep(1)
print('login')
def wrapper():
start=time.time
index()
end=time.time
print('程序运行时间',end-start)
wrapper()
#如果这样写我们就改变了源码或调用方式,不符合要求
#那我们按照不改变源码,不改变调用方式
#利用闭包函数
import time
def index():
time.sleep(1)
print('login')
def time_count(func):
#func=index #利用闭包函数的将变量func=index带给内部的wrapper函数
def wrapper():
start=time.time()
func()
end=time.time()
print('程序运行时间',end-start)
return wrapper #time_count函数的返回值为wrapper函数
index=time_count(index) #index=wrapper 括号内index为初始的index
index() #调用index就可以实现计时功能
为了让我们作的修改更能灵活,能继续增加功能,并且如果原代码函数有返回值,需要我们将返回值传递出来,我们可以将装饰器改成
import time
def time_count(func):
#func=index #利用闭包函数的将变量func=index带给内部的wrapper函数
def wrapper(*args, **kwargs):
start=time.time()
res=func(*args, **kwargs)
end=time.time()
print('程序运行时间',end-start)
return res
return wrapper #time_count函数的返回值为wrapper函数
@time_count
def index():
time.sleep(1)
print('login')
return 123
res=index()
print('返回值res',res)
这就是一个完整的装饰器
python语言中的函数装饰器的更多相关文章
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...
- python学习日记(函数--装饰器)
楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...
- 流畅的python第七章函数装饰器和闭包学习记录
本章讨论的话题 python如何计算装饰器句法 python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量) 闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存 ...
- Python: 无参数的函数装饰器
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...
- Python带参数的函数装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的函数装饰器 def say_hello(country): def wrapper(func): def ...
- Python学习第四十一天函数装饰器传参数的用法
在不改变函数的结构的基础,我们给函数加新的功能,用是函数装饰器,如果要给函数传递参数,那么应该怎么做呢 @timerdef test2(name,age): time.sleep(3) print(' ...
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
随机推荐
- python面向对象 : 抽象类(接口类),多态,封装(私有制封装)
一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...
- [UE4]寻找敌人
- 修改了jdk在环境变量中的路径怎么cmd中的jdk版本没有变
把path路径下的jdk配置放在前面%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot ...
- 第8章 传输层(3)_TCP协议
3. 传输控制协议(TCP) 3.1 TCP协议的主要特点 (1)TCP是面向连接的传输层协议.即使用TCP协议之前必须先建立TCP连接.在传送数据完毕之后,必须释放己经建立的TCP连接. (2)每一 ...
- CS RANK: AI & ML
http://csrankings.org/#/index?ai&mlmining 权威学术排名:30-100
- unity3d动态创建一个文本
2D文本需要Canvas和EventSystem,最好使用Editor来添加: 动态显示一个文本,采用3D Text的方式: GameObject text = new GameObject(); t ...
- CS229 6.2 Neurons Networks Backpropagation Algorithm
今天得主题是BP算法.大规模的神经网络可以使用batch gradient descent算法求解,也可以使用 stochastic gradient descent 算法,求解的关键问题在于求得每层 ...
- kafka-confluent管控中心安装
https://www.confluent.io/ 一个基于kafka的扩展平台,我们主要关注其管控中心. 由于监控中心只有企业版才有,所以下载企业版,并进行测试. 进入下载中心,可以看到两个版本: ...
- gentoo virtualbox 无法启动
以前的 virtualbox 可以启动,现在无法启动. 原因是因为更新了内核,而 virtualbox 的模块没有跟着更新,所以导致无法启动. emerge --ask --oneshot @modu ...
- linux 打压缩包
tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...