这里是清安,欢迎查阅本章,本章较为重要,后面的过程中,你会随处可见哦,特别是pytest中。以及unittest还有你可以自己写!!!
何为装饰器?
装饰器就是给某一个函数或某一个程序,再不改变它原程序的基础上添加其他的功能,比如家里有一口井,你想喝水,就需要一个工具来打水,这个工具可以称之为装饰。或者你可以更直白的理解为,你想把自己打扮的更花枝招展的,就需要很多的东西来装饰。
装饰器定义:
def log(func):
def wrapper(*args,**kwargs):
print("f{func.__name__}")
return func(*args,**kwargs)
return wrapper
我们先看一个普通函数:
def log(func):
# warning是警告,可以忽略
# {func.__name__}获取函数名
logging.warning(f'{(func.__name__)}函数正在执行')
# func()
def fun1():
print('这里是清安')
log(fun1)
# 这里的结果是:
# WARNING:root:fun1函数正在执行
清安这里是搭配logging来写的,下一章就会讲到logging。装饰器里面你可以写任何你想要的功能,实现加减乘除,循环列表等功能,小北这里走自动化测试的,所以就把logging放在这里举例了。问:为什么没有打印这里是清安?
答:因为我没有调用对应的函数。上面注释了。
写入装饰器
def log(func):
def wrapper():
logging.warning(f'{func.__name__}函数运行中')
return func
return wrapper()
def fun1():
print('清安')
@log
def fun2():
print('这里是清安')
# 其结果是:
# WARNING:root:fun2函数运行中
清安在fun2函数方法出引用了装饰器,fun1没有引用,这样就不需要再写调用函数也能跑起来并且看到控制台信息了。这里是添加了一个提示信息。
当你想要把装饰器引用到fun1()时。
fun_1 = log(fun1)
# WARNING:root:fun2函数运行中
# WARNING:root:fun1函数运行中
装饰器传参:
import logging
def log(func):
def wrapper(*args, **kwargs):
logging.warning(f'{func.__name__}函数运行中')
# print('args',args)
# print('kwargs',kwargs)
return func(*args, **kwargs)
return wrapper
@log
def qing():
print('清安')
@log
def qingan(age, name):
print(f"我叫{name},今年{age}岁")
@log
def anan(age):
print(f"今年{age}岁")
qing()
anan(age=21) # 指定传值用到**kwargs
qingan(21, '清安') # 位置传值用到*args
清安
今年21岁
我叫清安,今年21岁
WARNING:root:qing函数运行中
WARNING:root:anan函数运行中
WARNING:root:qingan函数运行中
装饰器传参与函数传值类似,也有位置传参与指定值传参。注释处可以看到传参具体信息,让你清除的看到对应从传值信息,这里小北可以告诉你,这里的传值是字典传值,与元组传值。