装饰器
一般而言,我们要想拓展原来函数代码,最直接的办法就是侵入代码里面修改,如果我们不能进入代码中修改代码,我们该怎样办呢??这个时候,python的装饰器就给了我们很大的启发。
那么,装饰器可以给我们提供什么好用的功能呢??
功能:简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
通用装饰器
def decorator(func):
def wrapper(*args,**kwargs): ##注意:wrapper()和func()的参数必须保持一致
print(time.time())
res = func(*args,**kwargs)
return res
return wrapper
练习:装饰器实现一个函数计时器
问题1:被装饰的函数有返回值
问题2:如何保留被装饰的额函数名和帮助信息文档
import time
import random
import string
import functools
li = [random.choice(string.ascii_letters) for i in range(100)]
def timeit(fun):
"""如何保留被装饰的函数的函数名和帮助信息"""
@functools.wraps(fun) #函数中有参数,参数是一个函数
def wrapper(*args,**kwargs):
"""这是一个计算运行时间的函数"""
start_time = time.time()
fun(*args,**kwargs)
end_time = time.time()
print("这个函数的运行时间为:%.6f"%(end_time - start_time))
return 1
return wrapper
@timeit
def con_add():
"""这是"""
s = ''
for i in li:
s += (i + ',')
print(s)
@timeit
def join_add():
print(','.join(li))
con_add()
join_add()
#print(test(2,3))
print(con_add.__doc__)
print(con_add.__name__)
注意:
- 装饰器函数中的函数有返回值,定义的函数没有返回值,此时,返回none;
- @functools.wraps(fun) 如何保留被装饰的函数的函数名和帮助信息,如果没有这一句,则打印的是wrapper函数的函数名和帮助信息