文章预览
定义:在不修改一个函数内部代码的情况下,给函数添加扩展功能,即只能在函数之前或者之后添加功能,不能在函数内部添加,常见的应用场景如log日志、权限检验等。
1.不带参数的装饰器
- 无参数无返回值得函数
def set_func(func):
def call_func():
print('————在函数之前添加功能——————')
func()
print('————在函数后面添加功能——————')
return call_func
@set_func
def func1():
print('____func1____')
func1()
2. 有参数有返回值得函数
def set_func(func):
def call_func(*args, **kwargs):
print('——————添加功能————————')
return func(*args, **kwargs)
return call_func
@set_func
def func1(m):
print('____func1____')
return m
f = func1(100)
print(f)
——————添加功能————————
____func1____
100
2.带有参数的装饰器import time
def set_log(log):
def set_func(func):
log_dict = {1: 'error', 2: 'warning'}
def call_func(*args, **kwargs):
with open('log.txt', 'a', encoding='utf-8') as f:
f.write('%s ---%s---调用了函数%s\n' % (log_dict[log], str(time.ctime()), func.__name__))
return func(*args, **kwargs)
return call_func
return set_func
@set_log(1)
def func1(m):
print('____func1____')
return m
f = func1(100)
print(f)
____func1____
100
error ---Fri Jan 5 22:01:24 2018---调用了函数func1
3.一个函数有两个装饰器
def set_log(func):
print('————开始装饰sel_log————')
def call_func():
print('___set_log___')
func()
return call_func
def set_func(func):
print('————开始装饰set_func————')
def call_func():
print('___set_func___')
func()
return call_func
@set_log
@set_func
def func1():
print('____func1____')
————开始装饰set_func————
————开始装饰sel_log————
___set_log___
___set_func___
____func1____
- 装饰器在代码写完后,此时不用调用函数,就会进行装饰
- 函数装饰时,会先执行离函数最近的装饰器
- 当调用函数时,函数会先执行离函数最远的装饰器再执行离的近的装饰器,再执行函数本身
………………………………