每日python,第二十一篇,装饰器

168 阅读2分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

这里是清安,欢迎查阅本章,本章较为重要,后面的过程中,你会随处可见哦,特别是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函数运行中

装饰器传参与函数传值类似,也有位置传参与指定值传参。注释处可以看到传参具体信息,让你清除的看到对应从传值信息,这里小北可以告诉你,这里的传值是字典传值,与元组传值。