装饰器:本质是一个Python函数,它的功能是让其它函数在不需要做任何代码变动的情况下,额外增加功能。
这篇文章写的很好,我将链接地址放这里:https://blog.csdn.net/xiangxianghehe/article/details/77170585
小白如何一步步写一个简单的装饰器:
step1. 装饰器需要将需要装饰的函数作为入参,下面例子中的func就代表被装饰的函数。所以第一步就是定义一个装饰器函数,其参数为func。
def deco(func):
step2:第二步是定一个返回函数,该函数用来包装func,即一个包括了func功能,然后同时加入了扩展代码的返回函数。
def deco(func):
def wrapper():
return wrapper
step3: 第三步,在wrapper()函数中将func()包括进来,鉴于func()可能有各种参数,为了能匹配各种参数,用(*args, **kwargs)作为其参数。
def deco(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
step4: 在wrapper中加入扩展的代码
def deco(func):
def wrapper(*args, **kwargs):
xxxxxx #func运行前执行的代码
func(*args, **kwargs)
xxxxxx #func运行后执行的代码
return wrapper
step 5: 使用
@ deco
funcaaa()
@deco
funcbbb(ss, dd, *tuple1, **key1)
import time
def deco_time(func):
def wrapper(*args, **kwargs):
begin_time = time.time()
func(*args, **kwargs)
end_time = time.time()
process_time = (end_time - begin_time) * 1000
print("{}执行时间为{}毫秒。".format(func.__name__, process_time))
return wrapper
@deco_time
def sleep_1sec_func(str_for_print):
print(str_for_print)
time.sleep(1)
@deco_time
def sleep_2sec_func():
time.sleep(2)
s1 = "使用等待1秒"
sleep_1sec_func(s1)
sleep_2sec_func()
使用等待1秒
sleep_1sec_func执行时间为1000.0572204589844毫秒。
sleep_2sec_func执行时间为2000.1144409179688毫秒。
写一个带参数的装饰器:
有些情况装饰器需要带参数,以获取更高的灵活度,具体的写法步骤如下:
step1. 装饰器需要将需要装饰的函数作为入参,下面例子中的func就代表被装饰的函数。所以第一步就是定义一个装饰器函数,其参数为func。
def deco(func):
step2:第二步是定一个返回函数,该函数用来包装func,即一个包括了func功能,然后同时加入了扩展代码的返回函数。
def deco(func):
def wrapper():
return wrapper
step3: 第三步,在wrapper()函数中将func()包括进来,鉴于func()可能有各种参数,为了能匹配各种参数,用(*args, **kwargs)作为其参数。
def deco(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
step4: 加上带参数的函数
def add_para_deco(para): # para为参数
def deco(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
return deco #注意要加返回函数deco
step5 在wrapper中加入基于参数的扩展的代码,例如
def add_para_deco(para): # para为参数
def deco(func):
def wrapper(*args, **kwargs):
if para = "xxx":
yyyyyyyy
else:
kkkkkkk
func(*args, **kwargs)
return wrapper
return deco #注意要加返回函数deco
step 6: 使用
@add_para_deco("xxx")
def sleep_1sec_func(xxxx):
xxxxxx
import time
def log_time(timing):
def deco_time(func):
def wrapper(*args, **kwargs):
begin_time = time.asctime(time.localtime(time.time()))
func(*args, **kwargs)
end_time = time.asctime(time.localtime(time.time()))
if timing == "begin":
print("{}开始执行的时间为{}".format(func.__name__,begin_time))
elif timing == "end":
print("{}结束执行的时间为{}".format(func.__name__,end_time))
else:
print("对{}装饰logtime时输入的参数错误".format(func.__name__))
return wrapper
return deco_time
@log_time("end")
def sleep_1sec_func(str_for_print):
print(str_for_print)
time.sleep(1)
@log_time("begin")
def sleep_2sec_func():
time.sleep(2)
if __name__ == "__main__":
s1 = "使用等待1秒"
sleep_1sec_func(s1)
sleep_2sec_func()