import time
import functools
import random
import string
defadd_log(f):#装饰器
@functools.wraps(f)#禁止显示装饰器的函数说名def_add_log(*args,**kwargs):#被装饰函数参数""" #函数说明
装饰器:字符串时间\函数名\运行时间\函数返回结果
"""
s_time=time.time()
res=f(*args,**kwargs)#
e_time=time.time()print(time.ctime())print("函数名:"+f.__name__)print("运行时间:%.6f"%(e_time - s_time))return res #被装饰函数返回值return _add_log
@add_log
defstr_add(li):#被装饰函数,参数""" #函数说明内容
字符列表 -----> 字符串,6位随机字符
输入:6个随机字符
输出:一个字符串
"""return''.join(li)#被装饰函数,返回值
l =[random.choice(string.ascii_letters)for i inrange(6)]print("运行结果:"+str_add(l))print(str_add.__doc__)#函数说明显示
显示结果:
Tue Dec 1000:06:002019
函数名:str_add
运行时间:0.000002
运行结果:GzfCmq
字符列表 -----> 字符串,6位随机字符
输入:6个随机字符
输出:一个字符串
多个装饰器
defdecorator_a(fun):definner_a(*args,**kwargs):print('Get in inner_a')
fun(*args,**kwargs)return inner_a
defdecorator_b(fun):definner_b(*args,**kwargs):print('Get in inner_b')
fun(*args,**kwargs)return inner_b
# 多个装饰器装饰函数 从上到下去执行的
@decorator_a
@decorator_b
deff(x):print('Gat in f')
f(1)
显示结果:
Get in inner_a
Get in inner_b
Gat in f
装饰器参数
import functools
defints_(*kind):#装饰器参数defints(f):
@functools.wraps(f)def_ints(*args,**kwargs):for i in args:ifnotisinstance(i, kind):#传入装饰器参数做对比print(f"TypeError,{i} is not {kind}")breakelse:
res = f(*args,**kwargs)return res
return _ints
return ints
@ints_(int)#装饰器参数defadd(a, b):return a + b
@ints_(float)#装饰器参数可修改defmymax(a,b,c,d):returnmax(a,b,c,d)print(f"add(1,2.0):{add(1,2.0)}")print(f"add(2,3){add(2,3)}")print(f"mymax(1,2,3,5){mymax(1,2,3,5)}")print(f"mymax(1.0,2.0,3.0,5.0){mymax(1.0,2.0,3.0,5.0)}")
显示结果:
TypeError,2.0isnot(<class'int'>,)
add(1,2.0):None
add(2,3)5
TypeError,1isnot(<class'float'>,)
mymax(1,2,3,5)None
mymax(1.0,2.0,3.0,5.0)5.0