装饰器:
把一个函数当作参数,返回一个替代版的函数
本质就是一个返回函数的函数
作用:在不改变原函数的基础上,给函数增加功能
装饰器的创建:
import time
def decorator(func):
def wrapper(*args,**kwargs):
print(time.time())
func(*args,**kwargs)
return wrapper
装饰器的调用:
@decorator
def f3(func_name1,func_name2,**kwargs):
print('This is function ' + func_name1)
print('This is function ' + func_name2)
print(kwargs)
函数的调用(和之前调用时一样)
f3('test1','test2',a=1,b=2,c='westos')
打印帮助文档
import random
import string
import functools
li = [random.choice(string.ascii_letters) for i in range(100)]
#随机生成100个字母
#定义装饰器
def timec(fun):
"""这是一个装饰器timec"""
@functools.wraps(fun) #导入一个functool
def wrapper(*args,**kwargs):
"""这是一个wrapper函数"""
#args:元组 kwargs:字典
#函数执行前
start_time = time.time()
res = fun(*args,**kwargs)
end_time = time.time()
print('运行时间为: %.6f' %(end_time - start_time))
return res
return wrapper
#定义函数
@timec
def con_add():
"""这是一个con_add函数"""
s = ''
for i in li:
s += (i + ',')
print(s)
print(con_add.__doc__) #打印函数的帮助文档
print(con_add.__name__) #打印函数的名字
判断是否为超级用户
import functools
import inspect
def is_admin(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
#inspect.getcallargs返回一个字典,key值:形参 value值:对应的实参
inspect_res = inspect.getcallargs(fun,*args,**kwargs)
print('inspect的返回值: %s' %inspect_res)
if inspect_res.get('name') == 'root':
res = fun(*args,**kwargs)
return res
else:
print('Permission denied!')
return wrapper
#定义函数
@is_admin
def add_student(name):
print('添加学生信息')
#调用函数
add_student('westos')
#结果
inspect的返回值: {'name': 'westos'}
Permission denied!
装饰器传参:
import time
import functools
def log_kind(kind):
def add_log(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
start_time = time.time()
res = fun(*args,**kwargs)
end_time = time.time()
print('<%s>[%s] 函数名: %s, 运行时间: %.6f, 运行返回值结果: %d'
%(kind,time.ctime(),fun.__name__,end_time - start_time,res))
return res
return wrapper
return add_log
#定义函数
@log_kind('debug')
def add(x,y):
time.sleep(1)
return x + y
#调用函数
add(1,2)
#结果:
多个装饰器:
同时定义多个装饰器,按照顺序调用
@deractor1
@deractor2
def fun(x):
return x**x