装饰器:
把一个函数当作参数,返回一个替代版的函数
本质就是一个返回函数的函数
作用:在不改变原函数的基础上,给函数增加功能
import time
def decorator(func):##接收原函数
def wrapper():##装饰器
print(time.time())
func()
return wrapper
@decorator
def f1():
print('this is a function')
# f = decorator(f1)
f1()
import string
import random
import functools
import time
def add_log(func):###源函数
"""zhuang shi qi
"""
##this is an add_log def
@functools.wraps(fun)##添加说明为原函数,若不加,则说明函数为装饰器函数
def wrapper(*args,**kwargs):###引入函数
##this is a wrapper def
start = time.time()
res=func(*args,**kwargs)
stop = time.time()
print('name is ' + add_log.__name__)
print('time is %.6f' %(stop-start))
print('fan hui zhi is ' + str(res))
print('def is ' + add_log.__doc__)
return wrapper
@add_log##使用装饰器
def add(x,y):
time.sleep(1)
return x + y
add(1,1)
装饰器类型接收,在外面加一个函数框架接收即可
import functools
def log_kind(*types):
def get_log(fun):
@functools.wraps(fun)
def required_types(*args,**kwargs):
for i in args:
if not isinstance(i,types):
print('TypeError',types)
break
else:
inspect_res = fun(*args,**kwargs)
return inspect_res
return required_types
return get_log
@log_kind(int,int)
def get(*args):
print(args)
a = get(1,2,3,4,5,66,(5,66,4,3,2),'d',2.2)
print(a)
多个装饰器时,装饰器执行顺序为从上往下执行,那个执行器在前就先执行那个