简介
装饰器本质上是一个python函数或者类,它可以让其他函数或者类在不需要做任何代码修改的前提下增加额外的功能,装饰器的返回值也是一个函数/类对象。
使用场景:插入日志、性能测试、事务处理、缓存、权限校验等场景
优点:有了装饰器,我们就可以抽离出大量函数功能本身无关的雷同代码到装饰器中并继续重用,概括的讲,装饰器的作用及时为了已经存在的对象添加额外的功能。
定义
def log(func):
def wrapper(*args,**kwargs):
print("{}的日志".formate(func.__name__))
return func(*args,**kwargs)
return wrapper
调用
@log
def test_func():
pass
背景
函数的传递性
python中的函数可以像参数一样传递给另外一个函数。
def func1():
print("func1被执行~")
def func2(func):
func()
func2(func1) # func1被执行~
日志函数
import logging
logging.warning(logging message)
执行函数打印日志
import logging
def func1():
print("func1被执行~")
logging.warning("func1的运行日志~")
def func2(func):
func()
func2(func1)
执行不同的函数打印不同的日志
def func1():
print("func1被执行~")
def func2():
print("func2被执行~")
def func3():
print("func3被执行~")
def func_log(func):
logging.warning('''{}正在运行~~'''.format(func.__name__))
func()
func_log(func1)
func_log(func2)
func_log(func3)
通过上面的例子我们发现,想要达到执行函数并且打印日志的功能,我们就需要通过调用日志函数来达到我们的目的,很难单纯的通过函数名去执行函数和打印日志,此时装饰器的好处就体现出来了…
装饰器的使用
# 装饰器的调用
def func_logging(func):
def wrapper():
print("{}的日志".format(func.__name__))
func()
return wrapper
@func_logging
def func1():
print("func1函数被执行")
func1()
# 装饰器调用原理
def func_logging(func): # func--->func1
def wrapper():
print("{}的日志".format(func.__name__))
func()
return wrapper # 函数
def func1():
print("func1函数被执行")
func1 = func_logging(func1)
func1()
# 被装饰的函数带有参数(有的带参数,有的不带参数,有的参数个数不确定)
def func_logging(func):
def wrapper(*args, **kwargs):
print("{}的日志".format(func.__name__))
func(*args, **kwargs)
return wrapper
@func_logging
def func1(name):
print("func1函数被执行",name)
@func_logging
def func2(name, age):
print("func2函数被执行",name, age)
@func_logging
def func3():
print("func3函数被执行")
func1('func1')
func2("func2",18)
func3()