python:装饰器

75 阅读2分钟

前言

python中有一个概念,叫做装饰器。
python中的装饰器,本质上就是一个函数,它的功能是:
     可以让一个函数,在不需要做任何代码改动的情况下增加某个功能。

什么是装饰器

本质:是一个函数
参数:是你要装饰的函数名(不是函数调用)
返回:装饰完的函数名(也不是函数调用)
作用:为已经存在的函数添加额外的功能
特点:不需要对已经存在的函数做任何代码上的变动

装饰器的作用

Python装饰器有很多经典的应用场景,比如:插入日志,性能测试,事务处理,权限校验等。
装饰器是解决这类问题的绝佳设计。

装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组件多个特定的装饰器,
这样我们就可以针对不同的需求去使用特定的装饰器,这时,因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。

demo

def log(func):
    def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
        
@log
def now():
    print('2021-3-25')


if __name__ == '__main__':
    now()
执行结果是:
函数对象本身是有一个__name__属性,通过该属性可以拿到函数的名字
调用now()函数,不仅会执行now()函数本身,还会在运行now()函数之前打印一行日志。
把@log放在now()函数的定义处,相当于执行了now=log(now)
wrapper()函数的参数定义是(***args,** **kw),因此,wrapper()函数可以接收任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。