python中的装饰器(装饰器的基本使用)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python中的装饰器(装饰器的基本使用),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4526字,纯文字阅读大概需要7分钟。
内容图文
![python中的装饰器(装饰器的基本使用)](/upload/InfoBanner/zyjiaocheng/712/4597c5f3c0e5474eb30a154318156c45.jpg)
文章目录
- 1.装饰器介绍
- 2.装饰器基本格式
- 3.装饰器的调用
- 4.装饰器传参————装饰器实现函数计时器
- 5.定义函数的名字(__name__)和解释说明(__doc__)的获取
- 6.原函数中存在返回值,装饰器如何处理?
1.装饰器介绍
- 装饰器:在不改变源函数的基础上,给函数添加功能
- 原理:把一个函数当作参数传递给另一个函数,返回一个替代版的函数;装饰器本质上就是一个返回函数的函数
2.装饰器基本格式
def outer(f) ##装饰器外部函数-->接收传递过来的函数参数;f表示要被装饰的函数
def inner(x) ##装饰器内部函数-->对接受的函数进行装饰;x表示被装饰函数中的参数
...
...
return inner ##返回装饰后的代替版函数 return inner相当于返回inner这个函数(调用函数);return inner() 返回的是inner这个函数的值
3.装饰器的调用
def fun():
print('hello')
def outer(f):
def inner():
print('******')
f()
print('******')
return inner
3.1普通调用
func=outer(fun)
func()
3.2语法糖调用
@outer
def happy():
print('happy')
happy()
例:
def outer2(f):
def inner(x):
# print(x)
if x <= 0:
x = 0
f(x)
else:
f(x)
return inner
@outer2
def say(age):
print('%d years old~~~~' % (age))
say(int(input('N:')))
或者:
fun2=outer2(say)
fun2(int(input('n:')))
4.装饰器传参————装饰器实现函数计时器
import time
def timeat(f):
def wrapper(*args ,**kwargs ):
start_time=time.time() ##函数开始执行时间
#res=f(*args,**kwargs ) ##执行函数
print(f(*args,**kwargs ))
end_time=time.time()
runtime=end_time -start_time
print('该函数运行时间为:%f'%(runtime))
# return res
return wrapper
def run(n):
return list(map(lambda x:x*2,[i for i in range(n)]))
fun=timeat(run)
fun(20)
5.定义函数的名字(name)和解释说明(doc)的获取
5.1获取方法
名字:函数名.__name__
说明:函数名.__doc__
5.2装饰器对原函数名字、说明获取的影响
当我们使用语法糖来使用装饰器时,默认获取原函数的名字和说明都会被捕获为装饰器的名字和说明
如下:
import time
# print(time.time() )
def timeat(f):
def wrapper(*args ,**kwargs ):
"""这是装饰器wrapper函数"""
start_time=time.time() ##函数开始执行时间
#res=f(*args,**kwargs ) ##执行函数
print(f(*args,**kwargs ))
end_time=time.time()
runtime=end_time -start_time
print('该函数运行时间为:%f'%(runtime))
# return res
return wrapper
@timeat
def run(n):
"""这是run函数"""
return list(map(lambda x:x*2,[i for i in range(n)]))
run(20)
@timeat
def fun_list(n):
"""这是fun_list函数"""
return [2 * i for i in range(n)]
fun_list(10)
print(fun_list.__name__ )
print(fun_list.__doc__)
print(run.__name__ )
print(run.__doc__ )
5.3装饰器对函数名字获取问题的解决
若想调用装饰器还依旧获取到原函数本身的名字和帮助文档,需要在装饰器中使用另一个装饰器,调用语法糖@functools
步骤(1)在代码开头 导入functools模块
import functools
步骤(2)在装饰器中使用语法糖
@functools.wraps(f) #f代表要被装饰的函数
以上例题为基础做修改:
import time
import functools
# print(time.time() )
def timeat(f):
@functools.wraps(f)
#@functools.wraps(f)
def wrapper(*args ,**kwargs ):
"""这是装饰器wrapper函数"""
start_time=time.time() ##函数开始执行时间
#res=f(*args,**kwargs ) ##执行函数
print(f(*args,**kwargs ))
end_time=time.time()
runtime=end_time -start_time
print('该函数运行时间为:%f'%(runtime))
# return res
return wrapper
@timeat
def run(n):
"""这是run函数"""
return list(map(lambda x:x*2,[i for i in range(n)]))
run(20)
@timeat
def fun_list(n):
"""这是fun_list函数"""
return [2 * i for i in range(n)]
fun_list(10)
print(fun_list.__name__ )
print(fun_list.__doc__)
print(run.__name__ )
print(run.__doc__ )
6.原函数中存在返回值,装饰器如何处理?
处理方法:
def outer(f):
def inner(x):
...
res=f(x)
...
return res
return inner
若原函数中没有返回值,不用return res
import time
import functools
# print(time.time() )
def timeat(f):
@functools.wraps(f)
#@functools.wraps(f)
def wrapper(*args ,**kwargs ):
"""这是装饰器wrapper函数"""
start_time=time.time() ##函数开始执行时间
res=f(*args,**kwargs ) ##执行函数
end_time=time.time()
runtime=end_time -start_time
print('该函数运行时间为:%f'%(runtime))
return res
return wrapper
@timeat
def fun_list(n):
"""这是fun_list函数"""
return [2 * i for i in range(n)]
print(fun_list(10000))
否则无返回值,打印无值:
例题:创建装饰器, 要求如下:
- 创建add_log装饰器, 被装饰的函数打印日志信息;
- 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx,
运行返回值结果:xxx
代码:
import time
import functools
def add_log(f):
@functools.wraps(f)
def wrapper(*args,**kwargs ):
start_time=time.time() ##起始时间
res=f(*args,**kwargs ) ##运行函数
end_time=time.time()
print("[%s] 函数名:%s 运行时间:%f 运行结果:%d"%(time.ctime(),f.__name__,end_time-start_time,res))
return res
return wrapper
@add_log
def fun(x,y):
return x+y
fun(200,200)
运行结果:
[Mon Sep 23 20:02:01 2019] 函数名:fun 运行时间:0.000000 运行结果:400
内容总结
以上是互联网集市为您收集整理的python中的装饰器(装饰器的基本使用)全部内容,希望文章能够帮你解决python中的装饰器(装饰器的基本使用)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。